SQL中的“NOT IN”语句问题

时间:2012-01-31 10:10:29

标签: sql

任何人都可以指出以下SQL语句的错误:

SELECT DiaryType 
FROM tblDiaryTypes 
WHERE DiaryType NOT IN (SELECT NextDiary 
                        FROM tblActionLinks 
                        WHERE HistoryType = 'Info Chased');

现在嵌套的SELECT语句当前返回NULL,因为tblActionLinks中最初没有条目,我想知道这是否是问题。

外部SELECT语句如果自己执行,则会按预期返回tblDiaryTypes中的所有日记类型。但是当我添加嵌套的SELECT语句来排除某些值时,整个SQL语句将返回空!

这是否与tblActionLinks目前为空的事实有关?如果是这样,我如何修改我的SQL语句来处理这种可能性。

4 个答案:

答案 0 :(得分:1)

对于SQL SERVER(您没有指定sql引擎),请尝试使用:

SELECT ISNULL(NextDiary, 0)  ...

如果没有找到任何行,则所有值都为null,那么它将返回0

答案 1 :(得分:1)

您确定目前tblActionLinks中没有条目吗?如果tblActionLinks中没有条目,则外部查询应返回所有记录

答案 2 :(得分:0)

  

这是否与tblActionLinks当前为空这一事实有关?

是的... NULLSQL中没有得到如此好的处理,将值与NULL进行比较undifned尝试为null提供一个标志值,如-999:

SELECT DiaryType 
FROM tblDiaryTypes 
WHERE DiaryType NOT IN (SELECT NVL(NextDiary, -999) -- <===
                        FROM tblActionLinks 
                        WHERE HistoryType = 'Info Chased');

NVL(NextDiary, -999)表示如果NextDiary IS NULL,请将值替换为-999

docs

答案 3 :(得分:0)

我会按以下方式重写您的查询:

SELECT DiaryType 
FROM tblDiaryTypes 
WHERE NOT EXISTS (SELECT NextDiary 
                         FROM tblActionLinks 
                         WHERE HistoryType = 'Info Chased'
                           AND NextDiary = DiaryType)

这确保了正确的行为,无论ANSI_NULLS设置如何,您都不必担心正确选择ISNULL(NextDiary, 0)返回的魔术值(如果DiaryType等于tblDiaryTypes,那该怎么办? }?)