NOT IN(与连接一起)查询

MSI*_*SIS 4 join sql-server t-sql sql-server-2014

我有两张桌子: PartOrderLine

Part (PartNum PK, PartDesc, Price)

OrderLine (OrderNum PK, PartNum PK, QtyOrdered)
Run Code Online (Sandbox Code Playgroud)

我想找出订购的零件。我想我有一个好主意,但我可能遗漏了一些东西;我认为最有可能在语法上。请检查:

select Part.PartNum
    ,OrderLine.OrderNum
from OrderLine
inner join Part on OrderLine.PartNum = Part.PartNum
where PartNum not in (
        select distinct (OrderNum)
        from OrderLine
        )
Run Code Online (Sandbox Code Playgroud)

这样对吗?

Dav*_*ave 5

如果您想要订购的零件,那么您应该从 开始Part,而不是OrderLine。当您考虑套装时,可以想象只有它可以拥有您正在寻找的物品。零件可以是有序零件的超,而 OrderLine 可以很容易地是零件的子集

SELECT PartName
FROM Part
WHERE PartNum NOT IN (
        SELECT PartNum
        FROM OrderLine
        )
Run Code Online (Sandbox Code Playgroud)

通常情况下,比较整数比字符串更有效,因此我更改了WHERE子句以查找 PartNums,而不是 PartNames。

  • 此外,如果您正在执行 NOT IN,那么您不需要在子查询上使用不同的内容。 (3认同)
  • `PartNum` 是 `Part` 中的 PK,因此也不需要第一个 `DISTINCT`。查询也可以写成(如果你只想要结果中的“PartNum”而不是来自“Part”的任何其他列):“SELECT PartNum FROM Part EXCEPT SELECT PartNum FROM OrderLine;” (2认同)