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 中存在 5 条记录

 trID
 1234
 4567
 9874
 1645
 2442

我希望我的结果集包含 4 条记录而不是 1645 条记录。但我只得到 NULL。此外,如果 rtHist 表中的第三条记录也是 NULL 而不是 1645,我也没有得到任何结果。当然,静态日期最终将是一个变量。

关于我所缺少的任何想法?提前致谢。SSEE 2008 R2

4

3 回答 3

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

NOT IN这是一篇关于andEXISTS和之间差异的精彩文章LEFT JOIN

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

于 2013-01-03T18:49:34.880 回答
0

我也遇到过类似的情况,空值滑入子查询并搞砸了。尝试

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

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

还有,为什么

(rteSchedDT = CAST(@targetDate AS DATETIME))

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

于 2013-01-03T18:54:23.680 回答
0

原因是该NOT IN子句扩展为一系列AND语句。由于将任何值与NULLisNULL进行比较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'

来源

于 2013-01-03T19:03:04.237 回答