[英]What is the practical difference between these two SQL statements?
在一次考试中,我被要求找回从未在鹿特丹运输过集装箱的运输者的名字。 正确答案是
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')
为什么两个语句都不会导致相同的结果? in ( ... where A <> B )
与not in ( ... where A = B )
之间的实际区别是什么?
[请注意, Transportation
是关系计划的中心,其所有主要属性都是外键]
让我们构建一个简单的表格作为示例:
容器
TransporterID | City
1 | 'Rotterdam'
1 | 'Paris'
2 | 'Rotterdam'
然后这个查询
SELECT TransporterID
FROM Container
WHERE Container.City <> 'Rotterdam'
结果将为1(巴黎行)
然后, WHERE Transporter.ID IN ( ...
语句将给出错误的结果(运输者1已到达“鹿特丹”)
除了其他答案指出的以外, NULL
考虑NULL
:
如果City
为NULL
两个查询都将在WHERE
子句中将比较视为FALSE
...
您的版本正在回答一个稍有不同的问题:“将集装箱运输到鹿特丹以外的其他地方的运输商的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
具有预期的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.