我有一个包含订单 - 供应商关系的普通表。它显示哪些供应商参与了哪个订单。显然,一个订单可以有多个供应商:
+---------+------------+
| 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对第一个表进行分组,并选择每个订单供应商列表中包含第二个表中至少一对的订单。
答案 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;
这颠倒了问题中的逻辑。首先考虑对,以及哪些对与每个供应商具有相同的订单。