sql-server SQL选择列中包含一个值但另一行中不包含另一个值的位置

ctehm74n  于 2022-10-31  发布在  其他
关注(0)|答案(2)|浏览(217)

我在下面的图片中有这个表。我尝试选择DestinationSystemID为“11”的所有行,而具有相同SupplierPartyID的其他行的DestinationSystemID不为“16”。
例如,在下表中,应选择以下行,因为它们具有DestinationSystem为11而不是16的行:

  • 7300009017706
  • 7300009043088
  • 7330509000502

不应选择以下项,因为它同时具有DestinationSystemID 11与16:

  • 7318270000006

我希望你能明白我想问你什么。

我试过搜索解决方案,但无法正确查询问题以找到解决方案。

piv4azn7

piv4azn71#

NOT EXISTS非常适合于此:

SELECT {explicit t.columns}
  FROM dbo.YourTableName AS t
  WHERE t.DestinationSystemID = 11
    AND NOT EXISTS
    (
      SELECT 1 FROM dbo.YourTableName AS t2
        WHERE t2.SupplierPartyID = t.SupplierPartyID
          AND t2.DestinationSystemID = 16
    );

有些人会建议NOT IN,但我坚信这是一个劣质的解决方案,会让新用户误入歧途。
Here is why you should avoid NOT IN,即使 * 在这个特定的例子中 * 该列 * 今天 * 不支持NULL。读者将采用这个“有效”的解决方案,并将其应用到其他场景中,或者在列以后变成NOT NULL时发现许多中断的查询。更详细的背景in this blog post在注解中提到。

xbp102n0

xbp102n02#

NOT IN 也 可以 将 其 作为 另 一 个 选项 使用 :

SELECT * FROM test a
WHERE DestinationSystemID = 11 
AND SupplierPartyID NOT IN (SELECT SupplierPartyID
                            FROM   test b
                            WHERE  a.SupplierPartyID = a.SupplierPartyID
                            AND b.DestinationSystemID = 16)

中 的 每 一 个
" 小 提琴 "

    • 注意 : * * 如果 目的 数据 行 接受 NULL 值 , 请 考虑 使用 NOT EXISTS 取代 NOT IN ( 请 参阅 上面 的 * 接受 * 答案 ) 。

相关问题