3

我需要创建一个查询来组合来自两个表的数据,我认为可能是 JOIN 和 UNION 的组合。

在这个例子中,我需要列出所有状态为活动的名字,只列出一次,他们的葡萄酒、苏打水、晚餐、甜点和水果偏好组合,按名字排序。

我不确定单独的 JOIN 是否有效,因为名称并不总是在两个表中,并且 UNION 很棘手,因为它们没有相同的列。我尝试使用空值来使 UNION 工作,但这给了我每个名称的重复行,而不是每个名称将它们分组为一行。

DRINK
====================================
name         status   wine    soda
----------   ------   ------  ------
John Smith   active   red     cola
Mary Jones   active   white   lemonade
Tom Brown    old      red     fanta
Judy White   active   red     dr pepper
Sam Wing     old      red     cola

FOOD
=============================================
name         status   dinner  dessert  fruit
----------   ------   ------  ------   ------
John Smith   active   steak   muffin   apple
Mary Jones   active   fish    cake     kiwi
Walter Yu    active   pasta   cake     banana
Jim Adams    old      steak   candy    apple
Adam Sheers  active   pasta   candy    grapes

我需要查询来生成这样的结果 -

RESULT
==================================================================  
name         status    wine     soda       dinner  dessert  fruit
----------   ------    ------   ------     ------  ------   ------
Adam Sheers  active    -        -          pasta   candy    grapes
John Smith   active    red      cola       steak   muffin   apple
Judy White   active    red      dr pepper  -       -        -
Mary Jones   active    white    lemonade   fish    cake     kiwi
Walter Yu    active    -        -          pasta   cake     banana

非常感谢您对此的任何帮助!

4

3 回答 3

2

这应该有效:

SELECT names.name, drink.wine, drink.soda, food.dinner, food.dessert, food.fruit
FROM
    (SELECT name FROM food WHERE status = 'active'
    UNION
    SELECT name FROM drink WHERE status = 'active') names
LEFT JOIN drink ON drink.name = names.name
LEFT JOIN food ON food.name = names.name

结果

| 姓名 | 葡萄酒 | 苏打水 | 晚餐 | 甜点 | 水果 |
-------------------------------------------------- --------------
| 约翰·史密斯 | 红色 | 可乐 | 牛排| 松饼 | 苹果| 高分辨率照片| CLIPARTO
| 玛丽琼斯 | 白色 | 柠檬水| 鱼| 高分辨率照片| CLIPARTO 蛋糕| 猕猴桃 |
| 余华 | (空) | (空) | 意大利面| 蛋糕| 香蕉| 高分辨率照片| CLIPARTO
| 亚当·希尔斯 | (空) | (空) | 意大利面| 糖果| 葡萄|
| 朱迪·怀特 | 红色 | 胡椒博士 | (空) | (空) | (空) |

看到它在行动

于 2013-01-11T22:20:10.180 回答
1
SELECT name, status, MAX(wine) wine, MAX(soda) soda, MAX(dinner) dinner, MAX(dessert) dessert, MAX(fruit) fruit
FROM
  (
    SELECT name, status, wine, soda, NULL dinner, NULL dessert, NULL  fruit
    FROM DRINK WHERE status = 'active'
    UNION ALL
    SELECT name, status, NULL wine, NULL soda, dinner, dessert, fruit
    FROM FOOD WHERE status = 'active'
  ) R
  GROUP BY name, status
于 2013-01-11T22:27:57.083 回答
0
select * 
from food f 
left join drink d on f.name = d.name 
where d.status = 'active' and f.status = 'active'
于 2013-01-11T22:20:15.127 回答