2012-10-15 33 views
1

我有下面的代碼,我希望有一些幫助,以確保這是正確的。 (緩慢的一天)SQL查詢 - 需要確保我有這個邏輯權

Select 
    A.Label, A.Name, C.UID, D.Unit 
From 
    A 
inner join 
    B on A.UID = B.FUID 
left join 
    C on B.UID = C.UID 
left join 
    D on C.unitID = D.ID 
Where 
    C.LName = 'Gas' 

上面的代碼讀取 - 讓所有的標籤,和相應的名稱,在Table A鏈接到一個紀錄Table B這可能會或可能不會有鏈接到它在C記錄,在D中可能有或沒有記錄,C.LName = 'gas'

請問這是正確的嗎?我需要的是拉從A存在於B數據,無論在C是否存在,或D.記錄

+0

你應該有'.. INNER JOIN B開A.UID = B.FUID' - 使用' ON'關鍵字 - 而不是'WHERE' - 加入條件。 –

+1

'F.UID'來自您的查詢?你有桌子嗎? –

+0

我糾正了這一點。謝謝你指出。 – Kobojunkie

回答

0

你需要把過濾器「氣」的加入,否則左加入將有效地內連接

Select 
    A.Label, A.Name, C.UID, D.Unit 
From 
    A 
inner join B on A.UID = B.FUID 
left join C on B.UID = C.UID 
      and C.LName = 'Gas' 
left join D on C.unitID = D.ID 
+0

這會在這種情況下有所作爲嗎? – Kobojunkie

+0

@Kobojunkie這取決於你的數據 - 從b到c的左連接背後的原因是什麼? – podiluska

+0

我需要爲A中的每個記錄成功返回一行,並返回該行的C和D值(如果有的話)。 – Kobojunkie

0

使用ON A.UID = B.FUID而不是where A.UID = B.FUID像這樣:

Select A.Label, A.Name , FUID, D.Unit 
From A 
inner join B ON A.UID = B.FUID 
left join C ON B.UID = C.UID 
left join D on C.unitID = D.ID 
Where C.LName = 'Gas'