SELECT其中group包含来自另一个表的值

时间:2017-03-07 15:14:11

标签: sql sql-server

我有一个包含订单 - 供应商关系的普通表。它显示哪些供应商参与了哪个订单。显然,一个订单可以有多个供应商:

+---------+------------+
| OrderId | SupplierId |
+---------+------------+
| O_1     | S_1        |
+---------+------------+
| O_1     | S_3        |
+---------+------------+
| O_2     | S_1        |
+---------+------------+
| O_2     | S_2        |
+---------+------------+
| O_2     | S_999      |
+---------+------------+

我还有另一张表,其中包含这样的供应商对(输入数据):

+--------------+--------------+
| SupplierId_1 | SupplierId_2 |
+--------------+--------------+
| S_1          | S_2          |
+--------------+--------------+
| S_2          | S_3          |
+--------------+--------------+

请注意,对是唯一的,因此如果有(S_1,S_2)对,则不会成对(S_2,S_1)。但是不可能说出该对将会以何种顺序出现:它可以是(S_1,S_2)或(S_2,S_1),但不是两者。

如何从这些货币对中获取供应商的订单ID?

例如,在这种情况下,选择Id O_1的订单不会被选中,因为没有(S_1,S_3)或(S_3,S_1)对,但是会选择O_2,因为至少有两个供应商有一对(S_1和S_2)。

所以基本上我需要按OrderId对第一个表进行分组,并选择每个订单供应商列表中包含第二个表中至少一对的订单。

1 个答案:

答案 0 :(得分:1)

一种方法使用两个连接:

select o1.orderid, p.supplierid_1, p.supplierid_2
from pairs p join
     orders o1
     on o1.supplierid = p.supplierid_1 join
     orders o2
     on o2.supplierid = p.supplierid_2 and
        o2.orderid = o.orderid;

这颠倒了问题中的逻辑。首先考虑对,以及哪些对与每个供应商具有相同的订单。

相关问题