2012-01-31 86 views
1

語句可以請人指出什麼是錯用下面的SQL語句:問題與「不在」在SQL

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

,因爲有兩個在tblActionLinks最初沒有條目嵌套的SELECT語句現在返回NULL,我想知道這是否是問題。

外部SELECT語句(如果自己執行的話)會按預期從tblDiaryTypes返回所有日誌類型。但是,當我添加嵌套的SELECT語句以排除某些值時,則整個SQL語句將返回空值!

這是否與tblActionLinks目前爲空的事實有關?如果是這樣,我該如何修改我的SQL語句來處理這種可能性。

+2

見http://stackoverflow.com/questions/129077/sql-not-in-constraint-and-null返回魔法值-values - 當ansi_nulls在此時將不返回結果。嘗試關閉ansi_nulls,你應該得到結果。 – Hecksa 2012-01-31 10:14:31

回答

1

的SQL Server(你沒有指定的SQL引擎)嘗試:

SELECT ISNULL(NextDiary, 0) ... 

如果沒有行找到的所有值爲null,則返回0

0

這是否有東西請問tblActionLinks目前是否爲空?

是... NULL不被處理的SQL這麼好,一個值設置爲NULL比較是undifned嘗試給像-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

+0

你說什麼NULL在SQL中處理得並不好呢?例如,(有文檔記錄的)「NULL = NULL」的事實不會被評估爲TRUE,因爲有些人可能會認爲這並不意味着它不那麼好。 – 2012-01-31 10:23:22

+0

@IgorKorkhov。那麼我認爲'NULL = NULL'是真的。如果你可以選擇NULL行爲,你會選擇它是平等的......就像在'C#,java'等' – gdoron 2012-01-31 10:26:24

+0

SQL(以及在關係代數)NULL意味着未知,你不能比較未知,因此,行爲。 – 2012-01-31 10:32:42

1

替換值確實存在無辰ntries目前在tblActionLinks?如果在tblActionLinks沒有條目,那麼外部查詢應返回的所有記錄

0

我會重寫查詢方式如下:

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

這可確保正確的行爲,不論ANSI_NULLS設置的,你不必擔心正確選擇通過ISNULL(NextDiary, 0)(如果你在tblDiaryTypesDiaryType等於0?)