我正在尝试排除作为子查询的一部分返回的记录。返回所有“项目”的列表,其中位置=“Q”,正数量,并且过去14天内没有交易。当我单独运行这两个查询时它们都工作正常,但是当我一起运行它们时,尽管有明确匹配的记录,但没有返回任何记录。
SELECT l.item AS 'Item'
FROM itemloc l
WHERE l.loc = 'Q' AND l.qty_on_hand > 0
AND l.item NOT IN
(SELECT t.item
FROM transaction t
WHERE t.RecordDate > DATEADD(DAY, -14, GETDATE())
GROUP BY t.item)
答案 0 :(得分:1)
而不是not in
,使用not exists
(或left join
并与NULL
进行比较)。所以,试试这个:
WHERE l.loc = 'Q' AND l.qty_on_hand > 0 AND
NOT EXISTS (SELECT 1
FROM transaction t
WHERE t.RecordDate > DATEADD(DAY, -14, GETDATE()) and t.item = l.item
)
问题是(可能)t.item
具有NULL
值。在这种情况下,NOT IN
会返回"未知"或"假"。而且,"未知"被视为虚假。因此,当子查询具有NULL
值时,表达式永远不会返回" true"。
您还可以通过在子查询中添加where
子句来解决此问题。但是,我发现NOT IN
的语义对于每个人都是不直观的。因此,我建议改为使用NOT EXISTS
。
此外,您不需要group by
子查询。这是多余的。
答案 1 :(得分:0)
编辑item
列,使其不可为空,这是正确的sql查询中断的地方。或者使用联接