我繼承了一個使用左連接的查詢。查詢所做的一件事就是刪除所有歸檔記錄,即archived ='Y'。這是查詢的外觀:SQL空值連接問題
select P.firstname, E.entityid, C.committeeid, L.locationname
from Pract P
left join Committee C
on P.commiteeid = C.committeeid
and c.archived = 'N'
left join Entity E
on P.entityid = E.EntityID
and e.archived = 'N'
left join Location L
on E.location = L.location
and l.archived = 'N'
結果應該只返回那裏存檔<>「Y」的記錄。我想用把過濾器與「上」的問題是,它會返回其中c.archived =「N」,只是把一個空的存檔領域的記錄,這是不正確的:
FirstName EntityID CommitteeId
John 55 null
如果c.archived ='Y',則記錄不應顯示。
我相信歸檔的過濾器應在where子句中,像這樣的:
select firstname, entityid, committeeid
from Pract P
left join Committee C
on P.commiteeid = C.committeeid
left join Entity E
on P.entityid = E.entityid
left join Location L
on E.Locationid = L.locationid
where c.archived = 'N'
and e.archived = 'N'
and l.archived = 'N'
我發現的問題是,有些情況,其中來自委員會存檔的字段爲空(這不是一個' Y'或'N')。使用我的解決方案錯誤地消除了記錄,因爲空<>'N.'
如果我試試這個:
where c.archived <> 'Y'
它不工作,我猜是因爲NULL不評價任何東西。
如果我試試這個:
where (c.archived = 'N' or c.archived is null)
這是行不通的,因爲它現在帶回所造成的左邊的空記錄加入。我不能用左連接替換內連接,因爲這會排除c.committeeid爲空的記錄。
我只想將歸檔的記錄帶回<>'Y',其中包括字段爲空的那些記錄。
需要明確的是,這是在表中的記錄可以是什麼樣子:
FirstName EntityID Archived
John 55 Y
Tom 56 NULL
Rob 57 N
在這種情況下我想要返回的記錄是這樣的:
Tom 56 NULL
Rob 57 N
約翰將被淘汰因爲存檔=「是」。
是否有另一種方法可以做到這一點?
*「我想用把過濾器的一個問題 」上「 是它會返回一個記錄,其中c.archived ='N'並且只在歸檔字段中放置一個null,正確。「*它確實如此。您正在進行**左連接**,這意味着**左**表中的所有元素都應包含在結果中。由於在符合該過濾器的右表上找不到匹配,因此您會爲這些列獲得空值。如果你只想在右**表中匹配匹配的元素,那麼做一個**內連接**。 – derloopkat
我繼承了這段代碼,並試圖使其正常工作。我相信最初的開發人員並沒有以正確的方式寫這篇文章。我不希望記錄返回如果「archived ='N',所以左連接是不合適的,但我希望記錄返回,如果表中的」歸檔「字段是空的我不能做一個內部聯接,因爲有如果C.committeeid爲空,我不能在「P.commiteeid = C.committeeid」上執行,我需要它僅返回一個實例,其中的連接右側的表中的字段爲空。記錄「歸檔」>「Y」。 – jackstraw22
http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM