这两个SQL语句之间的实际区别是什么?

这两个SQL语句之间的实际区别是什么?,sql,Sql,在一次考试中,我被要求检索从未在鹿特丹运输过集装箱的运输商的姓名。正确答案是 select Transporter.ID from Transporter where Transporter.ID not in ( select TransporterID from Container inner join Transportation on Container.ID = Transportation.ContainerID where Containe

在一次考试中,我被要求检索从未在鹿特丹运输过集装箱的运输商的姓名。正确答案是

select  Transporter.ID 
from    Transporter
where   Transporter.ID not in (
   select TransporterID
   from   Container
   inner join Transportation on Container.ID = Transportation.ContainerID
   where Container.City = 'Rotterdam')
然而,下面的答案被标记为错误答案:

select  Transporter.ID 
from    Transporter
where   Transporter.ID in (
   select TransporterID
   from   Container
   inner join Transportation on Container.ID = Transportation.ContainerID
   where Container.City <> 'Rotterdam')
为什么两种说法的结果不一样呢?在实践中,两者的区别是什么。。。其中A和B不在。。。其中A=B


[注意,运输是关系模式的中心,其所有主要属性都是外键]

您的版本回答了一个稍微不同的问题:在鹿特丹以外的地方运输集装箱的运输者的ID是什么

至于最佳答案,我将使用更具风格的材料和表格别名not exists:

select t.ID 
from Transporter t
where not exists (select 1
                  from Container c join
                       Transportation tr
                       on c.ID = t.ContainerID
                  where tr.TransporterID = t.id and
                        c.City = 'Rotterdam'
                 );

当子查询中的任何一行返回NULL时,NOT IN的行为与大多数人期望的不一样。在这种情况下,所有行都被过滤掉。“不存在”具有预期的行为。

您的版本回答了一个稍微不同的问题:在鹿特丹以外的地方运输集装箱的运输人的ID是什么

至于最佳答案,我将使用更具风格的材料和表格别名not exists:

select t.ID 
from Transporter t
where not exists (select 1
                  from Container c join
                       Transportation tr
                       on c.ID = t.ContainerID
                  where tr.TransporterID = t.id and
                        c.City = 'Rotterdam'
                 );

当子查询中的任何一行返回NULL时,NOT IN的行为与大多数人期望的不一样。在这种情况下,所有行都被过滤掉。NOT EXISTS具有预期的行为。

让我们构建一个简单的表作为示例:

容器

然后是这个查询

SELECT TransporterID
FROM Container
WHERE Container.City <> 'Rotterdam'
这将导致与巴黎的争吵


那么,Transporter.ID在哪里。。。语句将给出错误的结果。transporter 1已到达“Rotterdam”

让我们构建一个简单的表作为示例:

容器

然后是这个查询

SELECT TransporterID
FROM Container
WHERE Container.City <> 'Rotterdam'
这将导致与巴黎的争吵


那么,Transporter.ID在哪里。。。声明将给出错误的结果运输商1已经到了“鹿特丹”

除了其他答案指出的以外,还要考虑空值:


如果City为NULL,两个查询都会将WHERE子句中的比较视为FALSE…

除了其他答案所指出的,还要考虑NULL:


如果City为NULL,则两个查询都会将WHERE子句中的比较视为FALSE…

查询2将返回已交付到鹿特丹和至少一个以上地点的运输商。查询2将返回已交付到鹿特丹和至少一个以上地点的运输商。它实际上会将它们视为未知,不正确或错误。比较将返回NULL,WHERE子句将NULL视为不正确,结果与false相同…它将实际将它们视为未知,不正确或错误。比较将返回NULL,WHERE子句将NULL视为非真,结果与FALSE相同…您添加的关于不存在的信息非常有用,但我甚至无法对您的答案进行投票。您添加的关于不存在的信息非常有用,但我甚至无法对您的答案进行投票。