-1

例を使用して最もよく説明します。私の試行と結果は以下の例です。

2つのテーブルがあります(実際には複数のテーブルがあります)

表: 製品

ID    name
-----------
1    apple
2    orange
3    pear

表: 属性

ID  prod_ID   attr_id   value
----------------------------
1   1       101     20
2   1       102     red
3   1       103     sweet
4   2       101     30
5   2       102     orange
6   2       103     sour
6   3       101     40 
7   3       102     green
8   3       103     sweet

望ましい出力

name   attr_id 101 AS 'price'   attr_id 102 AS 'taste'
------------------------------------------------------
apple        20           sweet
orange       30           sour
pear         40           sweet

私はこれまでSQLを管理してきましたが、最近、3つのテーブルを呼び出して、上記のように列の値を組み合わせる必要がありました. 私はこれに頭を悩ませることはできません。助けていただければ幸いです。

4

4 に答える 4

2

質問で RDBMS について言及していないため、以下のクエリはほとんどの RDBMS で機能します。

SELECT  a.Name,
        MAX(CASE WHEN b.attr_ID = 101 THEN b.value END) Price,
        MAX(CASE WHEN b.attr_ID = 103 THEN b.value END) Taste
FROM    Products a
        INNER JOIN Attributes b
            ON a.ID = b.prod_ID
GROUP   BY a.Name
于 2013-04-25T10:51:31.123 に答える
1

そのためにステートメントを使用できますCASE:(これはMySQLで機能します)

SELECT p.name
   ,GROUP_CONCAT(CASE WHEN attr_id = 101 THEN value else NULL END) AS price
   ,GROUP_CONCAT(CASE WHEN attr_id = 102 THEN value else NULL END) AS color
   ,GROUP_CONCAT(CASE WHEN attr_id = 103 THEN value else NULL END) AS taste
FROM Products p JOIN Attributes a
ON p.id = a.prod_id
GROUP BY p.name;

または、結合でも同じことができます: (これは MySQL と SQL Server の両方で機能します)

SELECT Name
  ,CASE WHEN a.attr_id = 101 THEN a.value ELSE NULL END AS price
  ,CASE WHEN b.attr_id = 102 THEN b.value else NULL END AS color
  ,CASE WHEN c.attr_id = 103 THEN c.value else NULL END AS taste
FROM Products p
  LEFT JOIN Attributes a ON p.id = a.prod_id
  LEFT JOIN Attributes b ON p.id = b.prod_id AND a.attr_id = 101 AND b.attr_id = 102
  LEFT JOIN Attributes c ON p.id = c.prod_id AND a.attr_id = 101 AND c.attr_id = 103
WHERE a.attr_id IS NOT NULL and b.attr_id IS NOT NULL AND c.attr_id IS NOT NULL

のコラムも追加しましたcolor

出力

|   NAME | PRICE |  COLOR | TASTE |
-----------------------------------
|  apple |    20 |    red | sweet |
| orange |    30 | orange |  sour |
|   pear |    40 |  green | sweet |

このSQLFiddleを参照してください

SQL Server のデモ

于 2013-04-25T11:02:07.090 に答える
0

各列を個別にクエリする必要があります...

SELECT 
  p.name,
  (SELECT value FROM Attributes a WHERE attr_id=101 AND a.prod_ID=p.ID) AS price,
  (SELECT value FROM Attributes a WHERE attr_id=102 AND a.prod_ID=p.ID) AS taste
FROM Products p

... または ... MSSQL 2008 R2 を使用している場合は、PIVOT を使用できます: http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

于 2013-04-25T10:47:19.943 に答える