给定以下表格,我该如何构建一个SQL查询,其中包括“项目”表中所有项目的列表,以及“颜色”表中每种颜色的列,该列针对列出的每个项目指示哪些颜色项有关系。
如果还是不清楚的话,请告诉我还有哪些其他信息可以帮助您澄清。表信息和所需的SQL结果如下:
项目表:
id | item_name 1 | 'item 1' 2 | 'item 2' 3 | 'item 3'
颜色表:
id | color_name 1 | 'red' 2 | 'blue' 3 | 'green'
item_color表:
item_id | color_id 1 | 1 1 | 3 2 | 2 2 | 3 3 | 2
所需的SQL查询结果:
item_name | red | blue | green 'item 1' | 1 | null | 1 'item 2' | null| 1 | 1 'item 3' | null| 1 | null
谢谢,科林
使用:
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
如果要与某个项目关联的红色/蓝色/绿色的总数,请将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