2014-03-28 131 views
0

我想將查詢從THERAPY表中鏈接到我的查找表REF_CODE;字段PROT(可以爲空)和字段THER_TYPE(非空)。 REF_CODE包含多個查找類別,由CAT_ID進行區分。我此刻的查詢看起來是這樣的:SQL查詢 - 一次查詢兩個字段的鏈接

SELECT THER_ID, r1.CODE_NAME, r2.CODE_NAME 
FROM THER t 
LEFT JOIN REF_CODE r1 ON t.PROT = r1.CODE 
JOIN REF_CODE r2 ON t.THER_TYPE = r2.CODE 
WHERE EVENT_ID = 1234 
AND r1.CAT_ID = '1' 
AND r2.CAT_ID = '2'; 

有兩種治療記錄,其中EVENT_ID = 1234這個查詢只返回記錄,其中PROT不爲空。 PROT = null的記錄完全不會返回。

這是爲什麼?無論PROT是否爲空,我如何返回所有值?

+0

您使用的是什麼版本的SQL? – Abraham

+0

可能重複的[左外連接不工作?](http://stackoverflow.com/questions/12467744/left-outer-join-not-working) – Abraham

+0

使用Oracle 11g的方式.... – davemere

回答

1

試試這個..

SELECT THER_ID, r1.CODE_NAME, r2.CODE_NAME 
FROM THER t 
LEFT JOIN REF_CODE r1 ON t.PROT = r1.CODE 
and r1.CAT_ID = '1' 
LEFT JOIN REF_CODE r2 ON t.THER_TYPE = r2.CODE 
AND r2.CAT_ID = '2' 
WHERE EVENT_ID = 1234; 

以下是我對你的代碼進行更改:

  1. 你在你的第二JOIN做一個INNER JOINREF_CODE因此NULL值會降低結果。我把它改成一個LEFT JOIN

  2. 你的第二個問題歸結爲您filter criteriaONWHERE條款的位置。

第二點說明:

INNER JOIN,您可以使用ONWHERE interchangebly。基礎邏輯不會改變,也不會影響執行計劃。

它與OUTER JOINs完全不同。正如你可以看到你的情況,一個錯位的過濾器可以完全歪曲邏輯。

a。 Filter Criteria in the WHERE Clause

SELECT * FROM A left join B 
ON A.id=B.id 
WHERE B.id=1 

上面的查詢將起作用像INNER JOIN和整個結果僅限制與B.id=1行(注意,所述過濾器被應用到表上LEFT JOIN操作者的右側)

Filter Criteria in the ON Clause

SELECT * FROM A left join B 
ON A.id=B.id 
AND B.id=1 

上面的查詢,因爲它們被映射到table ALEFT JOIN操作者將只限制table B的行。所以結果將包含table B列所有行的table A和值僅適用於符合B.id=1

+0

感謝SoulTrain。 ..但我恐怕這仍然不會帶回PROT = null的記錄。不知道我在這裏錯過了什麼......! – davemere

+0

我想我知道是什麼導致你的情況。你可以嘗試更新的代碼,看看它是否工作。我會解釋這些變化,如果有效的話。 – SoulTrain

+0

您的Where子句限制了結果集。檢查更新的代碼。 – SoulTrain

1

我創建了一個SQL Fiddle查詢,以測試你的問題的條件的行。請檢查以確認它符合您的方案。

where子句正在爭奪左連接。將兩個過濾器上CAT_ID到加盟條款是這樣的:

SELECT THER_ID, r1.CODE_NAME, r2.CODE_NAME as Name2 
FROM THER t 
LEFT JOIN REF_CODE r1 ON t.PROT = r1.CODE AND r1.CAT_ID = '1' 
JOIN REF_CODE r2 ON t.THER_TYPE = r2.CODE AND r2.CAT_ID = '2' 
WHERE EVENT_ID = 1234; 

其他不乾淨的方式做,這就是圍繞與左側的where子句的部分與isnull()這樣加入:

SELECT THER_ID, r1.CODE_NAME, r2.CODE_NAME as Name2 
FROM THER t 
LEFT JOIN REF_CODE r1 ON t.PROT = r1.CODE 
JOIN REF_CODE r2 ON t.THER_TYPE = r2.CODE AND r2.CAT_ID = '2' 
WHERE EVENT_ID = 1234 
AND Coalesce(RTRIM(r1.CAT_ID),'1') = '1' 

看到這個相似的答案Left Outer Join Not Working

附加:

如果@ SoulTrain的查詢工作,那麼你一定也有在Ref_Code做不匹配排在療法行。在這種情況下,您確實需要使用兩個左連接,但連接的順序並不重要。請參閱updated SQL Fiddle Example以查看此查詢的實際操作。這是最後一個查詢。

SELECT THER_ID, r1.CODE_NAME, r2.CODE_NAME 
FROM THER t 
LEFT JOIN REF_CODE r1 ON t.PROT = r1.CODE and r1.Cat_ID = 1 
LEFT JOIN REF_CODE r2 ON t.THER_TYPE = r2.CODE AND r2.CAT_ID = '2' 
WHERE EVENT_ID = 1234; 
+0

嗨亞伯拉罕。第一個例子不起作用 - 仍然排除PROT = null的記錄。我錯過了什麼? – davemere

+0

這個答案是否有幫助http://stackoverflow.com/a/11096237/269123?他似乎做的唯一不同的是他在連接子句中使用括號。讓我知道這是否有幫助,我會更新答案。 – Abraham

+0

我看不出爲什麼這個聲明不應該得到想要的記錄。將條件移至on子句可解決問題。在這裏加入訂單並不重要。從r1到r2沒有關係。 davemere,你的問題在別的地方。當你從查詢中刪除r2時,你會得到記錄嗎?或者在刪除r1時獲得它們?檢查這一點,並考慮你的查詢。 –