令人困惑的查询结果或缺乏......
我试图通过从第二个表中可能已经存在的集合中排除记录来返回记录集。
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
答案 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
以下是关于NOT IN
与EXISTS
和LEFT JOIN
之间差异的精彩文章:
答案 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
语句。由于NULL
与NULL
之间的任何值进行比较,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'