帮助从多个表构建SQL查询

Col*_*ock 0 sql oracle plsql pivot oracle11g

给定下面的表格,我如何构建一个SQL查询,其中包含"items"表中所有项目的列表,以及"colors"表中每种颜色的列,对于列出的每个项目,它指示的是什么颜色item与...有关系.

如果不清楚,请告诉我哪些其他信息有助于澄清.表信息和所需的SQL结果如下:

物品表:

id | item_name
1  | 'item 1'
2  | 'item 2'
3  | 'item 3'
Run Code Online (Sandbox Code Playgroud)

颜色表:

id | color_name
1  | 'red'
2  | 'blue'
3  | 'green'
Run Code Online (Sandbox Code Playgroud)

item_color表:

item_id | color_id
1       | 1
1       | 3
2       | 2
2       | 3
3       | 2
Run Code Online (Sandbox Code Playgroud)

期望的SQL查询结果:

item_name | red | blue | green
'item 1'  |  1  | null |   1
'item 2'  | null|   1  |   1
'item 3'  | null|   1  | null
Run Code Online (Sandbox Code Playgroud)

谢谢,科林

OMG*_*ies 5

使用:

SELECT item_name,
       MAX(red) 'red',
       MAX(blue) 'blue',
       MAX(green) 'green'
  FROM (SELECT t.item_name,
         CASE
           WHEN c.color_name = 'red' THEN
             1
           ELSE
             NULL
         END 'red',
         CASE
           WHEN c.color_name = 'blue' THEN
             1
           ELSE
             NULL
         END 'blue',
         CASE
           WHEN c.color_name = 'green' THEN
             1
           ELSE
             NULL
         END 'green'       
    FROM ITEMS t
    JOIN ITEM_COLOR ic ON ic.item_id = t.item_id
    JOIN COLORS c ON c.id = ic.color_id)
GROUP BY item_name 
Run Code Online (Sandbox Code Playgroud)

如果您想要与项目关联的红色/蓝色/绿色的总数,请将MAX更改为COUNT.

使用子查询因子替代:

WITH icolors AS (
   SELECT t.item_name,
          CASE
           WHEN c.color_name = 'red' THEN
             1
           ELSE
             NULL
         END 'red',
     CASE
       WHEN c.color_name = 'blue' THEN
         1
       ELSE
         NULL
     END 'blue',
     CASE
       WHEN c.color_name = 'green' THEN
         1
       ELSE
             NULL
     END 'green'       
    FROM ITEMS t
    JOIN ITEM_COLOR ic ON ic.item_id = t.item_id
    JOIN COLORS c ON c.id = ic.color_id)
  SELECT t.item_name,
         MAX(t.red) 'red',
         MAX(t.blue) 'blue',
         MAX(t.green) 'green'
    FROM icolors t
GROUP BY t.item_name
Run Code Online (Sandbox Code Playgroud)