2013-01-03 103 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