0

次の表を検討してください

Name                                      Null?    Type
----------------------------------------- -------- --------------
PRODID                                             NUMBER
PRODNAME                                           VARCHAR2(50)

 Name                                      Null?    Type
 ----------------------------------------- -------- --------------
 PRODID                                             NUMBER
 PROPID                                             NUMBER
 PRONAME                                            VARCHAR2(100)
 PROVALUE                                           VARCHAR2(100)

サンプルデータは以下の通り

 select * from prodmas;
    PRODID PRODNAME
---------- --------------
       101 Surf
       102 Ariel
 select * from prodprop
 /

PRODID     PROPID PRONAME   PROVALUE                     
------ ---------- -----------------------------------------------
   101       1001 Price     100
   101       1002 color     Blue
   101       1003 Agent     AV
   102       1001 Price     95
   102       1002 Color     Orange
.....

このような通常の結合クエリ

 select prodname,provalue
 from prodmas pm
 inner join prodprop pp
 on pm.prodid = pp.prodid
 /
PRODNAME                                           PROVALUE
-------------------------------------------------- -----------
Surf                                               100
Surf                                               Blue
Surf                                               AV
Ariel                                              95
Ariel                                              Orange

しかし、期待される出力は次のようになります

Surf    100   Blue   AV 
Ariel    95   Orange AV
.......

願わくば、より明確に

4

2 に答える 2

3
SELECT  a.ProdID,
        a.ProdName,
        MAX(CASE WHEN b.ProName = 'Price' THEN b.ProValue ELSE NULL END) Price,
        MAX(CASE WHEN b.ProName = 'Color' THEN b.ProValue ELSE NULL END) Color,
        MAX(CASE WHEN b.ProName = 'Agent' THEN b.ProValue ELSE NULL END) Agent
FROM    prodmas a
        LEFT JOIN prodprop b
            ON .prodID = b.prodID
GROUP   BY a.ProdID, a.ProdName

の値の数が不明な場合はPRONAME、動的 SQL を使用することをお勧めします。そのため、クエリで他の変更を行う必要はありません。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(case when PRONAME = ''',
      PRONAME,
      ''' then PROVALUE end) AS ',
      PRONAME
    )
  ) INTO @sql
FROM prodprop;

SET @sql = CONCAT('SELECT   a.ProdID,
                            a.ProdName, ', @sql, ' 
                  FROM    prodmas a
                          LEFT JOIN prodprop b
                              ON a.prodID = b.prodID
                  GROUP   BY a.ProdID, a.ProdName');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

上記のクエリからの出力は同じです。

╔════════╦══════════╦═══════╦════════╦════════╗
║ PRODID ║ PRODNAME ║ PRICE ║ COLOR  ║ AGENT  ║
╠════════╬══════════╬═══════╬════════╬════════╣
║    101 ║ Surf     ║   100 ║ Blue   ║ AV     ║
║    102 ║ Ariel    ║    95 ║ Orange ║ (null) ║
╚════════╩══════════╩═══════╩════════╩════════╝
于 2013-03-25T08:27:26.043 に答える
-2

すべてを静的に指定しても問題ない場合はprodprop、取得するプロパティごとに結合してこれを行うことができます。

SELECT p.prodname, 
    prop1001.provalue AS Price, 
    prop1002.provalue AS Color, 
    prop1003.provalue AS Agent
FROM prodmas p
LEFT OUTER JOIN prodprop prop1001 ON p.prodid = prop1001.prodid 
    AND prop1001.propid=1001
LEFT OUTER JOIN prodprop prop1002 ON p.prodid = prop1002.prodid
    AND prop1002.propid=1002
LEFT OUTER JOIN prodprop prop1003 ON p.prodid = prop1003.prodid
    AND prop1003.propid=1003

それ以外の場合は、動的 SQL を使用してカスタム クエリを作成するか、プロパティ テーブルをそのまま返して、フロント エンドで書式設定を行う必要があります。

于 2013-03-25T08:27:21.060 に答える