我无法相信我是第一个问这个问题的人,但我找不到正确的方法来实现以下查询。 从逻辑上讲,这似乎很简单,但我很难对其进行编码
我有2张桌子,我想从表1中获取所有汽车和cust_id,其中表2(按车分组)的完整颜色列表与表1中的颜色相匹配。 问题的关键是表1中并非所有颜色都必须在表2中
我一直在尝试连接,存在和交叉,但无济于事 如果至少有1个项匹配,则所有与下面类似的代码都匹配,但不是全部。
SELECT
a.Cust_Id,
a.Car
FROM Table1 a
JOIN Table2 b ON a.Car = b.Car and a.Colour = b.Colour
GROUP BY a.Cust_Id, a.Car
它是一个更大的脚本的一部分,做了很多其他的事情,所以我用汽车/颜色作为一个例子,所以欣赏它在这种情况下没有多大意义。
表1
表2
预期产出
Output
1 Audi
1 Ford
2 VW
答案 0 :(得分:4)
对于每个组,从NULL
计算Table1
颜色的数量,并确保此计数为零。这意味着第二个表中的每种颜色都映射到第一个表中的颜色。
SELECT b.Cust_Id,
b.Car
FROM Table1 a
RIGHT JOIN
(
SELECT 1 AS Cust_ID, Car, Colour
FROM Table2
UNION ALL
SELECT 2, Car, Colour
FROM Table2
) b
ON a.Car = b.Car AND
a.Colour = b.Colour AND
a.Cust_ID = b.Cust_ID
GROUP BY b.Cust_Id,
b.Car
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0
请注意,我使用子查询来增强第二个颜色要求表。我假设每个客户都有相同的要求,我添加了一个Cust_ID
列,以使联接更容易处理和分析。
答案 1 :(得分:1)
有点晚了,因为我看到你已经有了一个解决方案,但是这里有一些SQL,以防它可能有用。我读这个问题的方式,table1可能是来自不同客户的汽车愿望清单,table2是汽车经销商可以提供的清单。经销商想知道哪些顾客对每辆车的全部颜色感兴趣:
select w.cust_id, w.car
from table1 w join table2 s
on w.car=s.car and w.colour=s.colour
group by w.cust_id, w.car
having count(s.car)=(select count(*) from table2 where car=w.car);
答案 2 :(得分:0)
认为我已经解决了它,稍微修改了RIGHT JOIN标准,似乎与我运行的测试一起工作。
SELECT b.Cust_Id,
b.Car
FROM Table1 a
RIGHT JOIN
(
SELECT b.Cust_ID, a.Car, a.Colour
FROM Table2 a, Table1 b
) b
ON a.Car = b.Car AND
a.Colour = b.Colour AND
a.Cust_ID = b.Cust_ID
GROUP BY b.Cust_Id,
b.Car
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0