【问题标题】:Select ID's that have rows with NBR 1 and 2 on separate rows选择在不同行上具有 NUMBER 1 和 2 行的 ID
【发布时间】:2019-04-03 11:29:41
【问题描述】:

我希望编写 SQL 以返回 VENDOR_ID 的行同时具有 NBR_ID = 1 的行和 NBR_ID = 2 的另一行。在下面的示例中,SQL 将返回 VENDOR_ID 93309A 的数据,其中一行是 NBR_ID 1 ,另一行是 NBR_ID 2。

GROUP_ID     VENDOR_ID    NBR_ID
AUX          27           1
AUX          87188A       1
AUX          92481A       1
AUX          92482A       1
AUX          92527A       1
AUX          93309A       1
AUX          93309A       2
AUX          93328A       1

我编写了以下 SQL,但这并没有专门返回 VENDOR_ID 的 NBR_ID 为 1 的行和 NBR_ID 为 2 的另一行。

SELECT GROUP_ID, VENDOR_ID, NBR_ID
FROM TEST_TABLE
WHERE NBR_ID IN (1,2)

如何更新以仅返回在不同行上具有这些 NBR_IDVENDOR_ID

【问题讨论】:

    标签: sql sql-server sql-server-2014


    【解决方案1】:

    使用相关子查询

    SELECT GROUP_ID,VENDOR_ID,NBR_ID
    FROM TEST_TABLE a
    WHERE exists(select 1 from TEST_TABLE b where a.GROUP_ID=b.group_id and 
    a.VENDOR_ID=b.vendor_id and NBR_ID IN (1,2) 
    having count(distinct nbr_id)=2) and NBR_ID IN (1,2) 
    

    【讨论】:

    • 完美运行!谢谢!
    • 这似乎返回了 VENDOR_ID 的行,其中 NBR_ID 的行数大于 2,即如果 VENDOR_ID 有 4 个 NBR_ID,它将返回第 1-4 行,每个在不同的行上。我怎样才能返回只有 NBR_ID 第 1 行和第 2 行的 VENDOR_ID
    • 谢谢 - 有没有办法仍然像以前一样选择 GROUP_IDNBR_ID 列?
    • 太棒了,按预期工作!再次感谢您的跟进。
    【解决方案2】:

    你可以使用聚合:

    SELECT GROUP_ID, VENDOR_ID
    FROM TEST_TABLE
    WHERE NBR_ID IN (1, 2)
    GROUP BY GROUP_ID, VENDOR_ID
    HAVING COUNT(DISTINCT NBR_ID) = 2;
    

    这不会返回 NBR_ID 有两个原因。首先,您的问题并未指定您想要它。其次,它相当多余,因为您知道列表由 1 和 2 组成。

    【讨论】:

    • 我将NBR_ID 添加到SelectGroup By,但它没有返回任何数据。我仍然想显示这一列,并返回两行(分别为NBR_ID 1 和NBR_ID 2)。
    • 此外,这似乎返回了 NBR_ID 1 和 NBR_ID 2 以上的行,它还返回了 NBR_ID、3 或更多的 VENDOR_ID。理想情况下,我只想返回只有 1 和 2 的。
    【解决方案3】:

    使用存在

    select t1.* from TEST_TABLE t1
    where exists ( select 1 from TEST_TABLE t2 where t1.VENDOR_ID=t2.VENDOR_ID
                                             and t1.GROUP_ID=t2.GROUP_ID
                                          and NBR_ID in (1,2)
                                          having count(distinct NBR_ID)=2)
    and NBR_ID in (1,2)
    

    【讨论】:

    • 这是不正确的,它返回每个 VENDOR_ID 的 NBR_ID 大于 2 的行(例如 3、4、5)
    • 这仍会返回 NBR_ID 大于 2 的行的 VENDOR_ID(例如 3、4、5)。
    • @Nick 立即查看
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多