【问题标题】:SELECT where group contains values from another tableSELECT where group 包含来自另一个表的值
【发布时间】:2017-03-07 23:19:03
【问题描述】:

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

+---------+------------+
| 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 对第一个表进行分组,然后从第二个表中选择每个订单供应商列表中至少包含一对的订单。

【问题讨论】:

  • 是否有任何列可用作“排序依据”?

标签: sql sql-server


【解决方案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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多