[英]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.