这两个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相同…您添加的关于不存在的信息非常有用,但我甚至无法对您的答案进行投票。您添加的关于不存在的信息非常有用,但我甚至无法对您的答案进行投票。