不在子查询中

时间:2014-09-29 15:32:31

标签: sql

我正在尝试排除作为子查询的一部分返回的记录。返回所有“项目”的列表,其中位置=“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)

2 个答案:

答案 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查询中断的地方。或者使用联接