选择1个表中的所有列表与另一个表中的列表匹配的位置

时间:2017-02-21 09:36:01

标签: sql sql-server sql-server-2008

我无法相信我是第一个问这个问题的人,但我找不到正确的方法来实现以下查询。 从逻辑上讲,这似乎很简单,但我很难对其进行编码

我有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

enter image description here

表2

enter image description here

预期产出

Output
1   Audi
1   Ford
2   VW

3 个答案:

答案 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