簡體   English   中英

這兩個SQL語句之間的實際區別是什么?

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

如果CityNULL兩個查詢都將在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM