子查询未返回预期结果

时间:2013-01-03 18:45:37

标签: tsql subquery

令人困惑的查询结果或缺乏......

我试图通过从第二个表中可能已经存在的集合中排除记录来返回记录集。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我遇到类似的情况,其中空值滑入子查询并弄乱了。尝试

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

我怀疑这不是问题,但值得一试。

另外,为什么

(rteSchedDT = CAST(@targetDate AS DATETIME))

?只需将@targetDate设为日期时间变量即可。

答案 2 :(得分:0)

原因是NOT IN子句扩展为一系列AND语句。由于NULLNULL之间的任何值进行比较,AND 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

相关问题