2013-03-26 48 views
0

我對面的一個問題來了這裏,當我編寫一個查詢像這樣:左聯接屈服沒有結果

SELECT a.v, b.w, c.x, d.y, e.z 
FROM a 
JOIN b 
on a.id = b.id 
LEFT JOIN c 
on a.id = c.id 
LEFT JOIN d 
on b.code=d.code 
JOIN e 
on a.n = e.n 
WHERE 
a.zone = 10 
WITH (nolock) 

我拿到幾百結果,但是當我將它修改爲這樣:

SELECT a.v, b.w, c.x, d.y, e.z 
FROM a 
JOIN b 
on a.id = b.id 
LEFT JOIN c 
on a.id = c.id AND c.n = 0 
LEFT JOIN d 
on b.code=d.code AND d.n = 0 
JOIN e 
on a.n = e.n 
WHERE 
a.zone = 10 
WITH (nolock) 

我得到零結果。

根據我對SQL和左連接的理解,我覺得使用第一個查詢獲取任何結果意味着我應該至少獲得第二個結果,如果只有一個來自c和d的字段爲null。 PROGRESS是否以不尋常的方式實現外部連接?

+1

我認爲這是因爲'B'不是一個左連接,當你加入'D'到'B'這個效果''a'' – 2013-03-26 15:47:55

回答

0

您可能想知道c.nd.n值是什麼。嘗試這樣的事情來找出你的出發點在哪裏。

SELECT c.n, d.n, count(*) 
FROM a 
JOIN b 
on a.id = b.id 
LEFT JOIN c 
on a.id = c.id 
LEFT JOIN d 
on b.code=d.code 
JOIN e 
on a.n = e.n 
WHERE 
a.zone = 10 
group by c.n, d.n 

然後你就可以根據結果調整您的查詢

+0

cn,dn和a.zone比較實際上作爲參數傳遞給查詢。它在c.n和d.n與數據庫中的值匹配時起作用,但左連接的想法是即使它們不這樣做也能使其工作。 (它們恰好是描述性表格的關鍵,並不總是存在) – Sconibulus 2013-03-26 15:57:01

+0

如果輸入值,則不是。如果你試圖找到他們不匹配的地方,你需要尋找一個不爲零的空值。 'c.n是空的' – Lance 2013-03-26 15:59:06