2013-01-03 171 views
0

莫名其妙查詢結果或缺乏...子查詢沒有返回預期的結果

我試圖返回排除從集合可以在第二個表已經存在的記錄創下了一個紀錄。

SELECT  trID 
FROM   ttTrct 
WHERE  (trID NOT IN 
      (SELECT rteVehID 
       FROM rtHist 
       WHERE (rteSchedDT = '11/19/2012 12:00:00 AM'))) 


ORDER BY tractorID 

實際where子句...

WHERE (rteSchedDT = CAST(@targetDate AS DATETIME)) 

,但一直也有靜態的日期值試圖避免出現任何問題。

三個記錄rtHist

存在
rteVehID rteSchedDT 
NULL  11/12/2012 12:00:00 AM 
NULL  11/19/2012 12:00:00 AM 
1645  11/19/2012 12:00:00 AM 

五個記錄ttTrct

trID 
1234 
4567 
9874 
1645 
2442 

我期待我的結果集,包括4條記錄,而不是1645年。但我只得到NULL存在。另外,如果rtHist表中的第三條記錄也是NULL而不是1645,那麼我也不會得到任何結果。當然,靜態日期最終將是一個變量。

關於我失蹤的任何想法?提前致謝。 SSEE 2008 R2

回答

1

您可以使用NOT EXISTS

SELECT trID 
FROM ttTrct t 
WHERE not exists (SELECT rteVehID 
        FROM rtHist h 
        WHERE rteSchedDT = '11/19/2012 12:00:00 AM' 
        and t.trID = h.rteVehID) 
ORDER BY tractorID 

SQL Fiddle with Demo

這裏是關於NOT INEXISTSLEFT JOIN之間的差異很大的文章:

NOT IN vs. NOT EXISTS vs. LEFT JOIN/IS NULL: SQL Server

+0

絕對棒極了!謝謝!!!!出於某種原因,我不能將此標記爲答案。我會盡快再試一次。 – htm11h

0

我還有類似的情況,即空位漏失進入子查詢並搞砸了。嘗試

... 
WHERE (rteSchedDT = '11/19/2012 12:00:00 AM' 
     and rteScheDT is not null))) 
... 

我懷疑這不是問題,但它值得一試。

也,爲什麼

(rteSchedDT = CAST(@targetDate AS DATETIME)) 

?只需使@targetDate成爲日期時間變量即可。

0

原因是NOT IN子句擴展爲一系列AND語句。由於比較任何值NULLNULLAND NULL總是導致NULL,您的where子句永遠不會TRUE。它總是NULL

嘗試:

SELECT trID 
FROM  ttTrct 
WHERE (trID NOT IN 
     (SELECT rteVehID 
     FROM rtHist 
     WHERE (rteSchedDT = '11/19/2012 12:00:00 AM') 
      AND rteVehID IS NOT NULL)) 

或者你可以只使用一個連接,這將很可能具有相同或更好的執行計劃:

SELECT  t.trID 
FROM  ttTrct t 
INNER JOIN rtHist r 
     ON t.trID = r.rtHist 
WHERE  r.rteSchedDT = '11/19/2012 12:00:00 AM' 

Source