2013-11-27 71 views
2

今天我在下面的代碼中遇到過。你什麼時候INNER JOIN LEFT JOINed表/

SELECT StaffGroup.* 
FROM StaffGroup 
LEFT OUTER JOIN StaffByGroup 
    ON StaffByGroup.StaffGroupId = StaffGroup.StaffGroupId 
INNER JOIN StaffMember 
    ON StaffMember.StaffMemberId = StaffByGroup.StaffMemberId 
WHERE StaffByGroup.StaffGroupId IS NULL 

主表StaffGroup被遺忘加入了與StaffByGroup表,然後StaffByGroup表正被INNER加入了與StaffMember表。

我認爲INNER JOIN試圖過濾出StaffGroupStaffByGroup中存在的記錄,但StaffMember中不存在。

但這不是它是如何工作的。該查詢不返回任何記錄。

我在理解查詢邏輯時錯過了一些東西嗎?你有沒有使用INNER JOIN和在查詢的早期部分使用過LEFT JOIN的表?

+0

如果刪除where子句,它是否返回記錄? – Szymon

+0

是的。如果我刪除WHERE子句,它將返回所有三個表中存在的記錄。 – jags

回答

1

這個查詢看起來根本缺陷 - 我猜本來意爲

SELECT StaffGroup.* 
FROM StaffGroup 
LEFT OUTER JOIN 
    (SELECT * FROM StaffByGroup 
    INNER JOIN StaffMember 
    ON StaffMember.StaffMemberId = StaffByGroup.StaffMemberId) StaffByGroup 
ON StaffByGroup.StaffGroupId = StaffGroup.StaffGroupId 
WHERE StaffByGroup.StaffGroupId IS NULL 

返回從StaffGroup是不」已分配給他們(INNER JOIN與StaffMember過濾掉那些StaffByGroup行沒有匹配的行StaffMember現有staffmembers所有羣體 - 可能是因爲它們之間不存在外鍵)

+0

我不認爲這是從原來的查詢不同。並且它沒有返回結果,因爲沒有記錄'WHERE StaffByGroup.StaffGroupId IS NULL' – VitaliyG

+0

@VitaliyG這與原始查詢非常不同。原始查詢*無法返回任何結果,因爲內部聯接只允許在StaffMember/StaffByGroup中具有匹配行的結果,然後這些行將由WHERE子句刪除。我修改後的查詢首先返回StaffGroup中的* all *行以及StaffByGroup/StaffMember的可選值,然後刪除那些沒有匹配StaffMember/StaffByGroup的行。 –

+0

是的你是對的。你認爲什麼,也許StaffMember可以簡單地離開加入,而不是使用子選擇。 – VitaliyG

1

你得到,因爲你where clause

where StaffByGroup.StaffGroupId is null 

left join鏈接0條記錄都來自TBL A,其包含在TBL B和你既然已指定StaffGROUPID爲您的密鑰,然後尋找Nulls值的記錄在你的鑰匙,其100%的清楚,你最終會沒有結果

2

其實你缺少一個概念: 主表StaffGroup正在LEFT JoinedStaffByGroup表和T母雞這將創建一個virtual tableVT1與StaffGroup從StaffByGroup所有記錄和匹配記錄基於在ON predicate.Then你匹配/過濾條件沒有StaffByGroup表,但這個VT1是基於ON謂詞匹配/過濾條件是INNER JoinedStaffMember表。 所以基本上內連接試圖從StaffGroup中篩選出那些記錄,因此StaffByGroup沒有StaffMemberId。 添加您的where條件會添加一個類似於由上述所有聯接創建的最終虛擬表的最終過濾器,刪除所有沒有StaffGroupId的記錄,這樣可能會刪除VT1中收集的所有行,因爲它們都將具有一些值爲StaffGroupId。

要想從StaffGroup它們沒有什麼可StaffGroupId與StaffMember細節所有這些記錄一起,你可以在謂詞添加條件的所有記錄爲:

SELECT StaffGroup.* 
FROM StaffGroup 
LEFT OUTER JOIN StaffByGroup 
    ON StaffByGroup.StaffGroupId = StaffGroup.StaffGroupId and StaffByGroup.StaffGroupId IS NULL 
INNER JOIN StaffMember 
    ON StaffMember.StaffMemberId = StaffByGroup.StaffMemberId 
+0

可以安全地說,查詢是錯誤的,需要更正嗎?其實這是現有的代碼,我正在對其進行逆向工程。 – jags

+0

這實際上取決於你有什麼確切的要求。我提出了一個示例場景。希望這有助於..:) – Deepshikha

相關問題