2013-02-26 36 views
0

我有幾個問題爲Oracle編寫連接語句。我想我想要使用左連接,但我不是100%確定的。加入兩張表,其中可能不存在連接

這裏是我的兩個表

**VisibilityTable** 
Industry 
ProductID 
Visibility 
etc 

**ItemTable** 
ProductID 
Other Info 
etc 

這裏的問題。我有〜15個行業。每個行業都希望能夠根據自己的偏好將產品(〜15000)標記爲公共或私有產品。如果您想要查看特定行業的產品設置爲公共或私有產品,則我的查詢工作正常。

我遇到的問題是產品被標記爲一個行業的公共或私人產品後,它不再出現在尚未標記的行業中。這是我的查詢到目前爲止:

SELECT v.*, NVL(b.VISIBILITY,'Not Marked') Visibility 
FROM ItemTable v 
LEFT OUTER JOIN VisibilityTable b ON b.ProductID = v.ProductID 
WHERE (
(v.STATUS LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.MODEL LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.DUTY LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.CERTIFICATION LIKE 'Filter' or 'Filter' LIKE 'All') 
) 

這工作你爲我標記爲「未標記」,「私人」,「公共」,但我不能把它拉回來的人的物品避風港在選定的行業中未被標記。

編輯:添加完整的where子句。這是動態生成的,然後根據來自配置文件的值傳入。

例如,ProductID 85322已被標記爲Private EPGBio,但是當我選擇Industry EPGMethane時,它不顯示爲「未評論」。它顯示爲標記爲Private。

+1

如果'Industry = xxx'在你的where子句中,當然你不會得到沒有可見性條目的行。編輯:剛剛看到戈登的答案。是的,通過在您的where子句中過濾Industry,您正在擊敗您的左連接的目的。 – Scotch 2013-02-26 17:15:15

+1

你的意思是「那些在選定行業中未被標記的」?這不是什麼*未標記*的意思? – 2013-02-26 18:36:19

+0

是的,但尚未標記的記錄在VisibilityTable中沒有條目,只有已標記的記錄才具有該條目。理論上,VisibilityTable將具有(產品數量*行業數量)條目。 – Jabsy 2013-02-26 18:42:45

回答

2

我認爲這是因爲你正在篩選出他們沒有出現在where子句中的結果。

當您在where子句中引用「b」表時,您隱式地將left outer join更改爲inner join。 (除非您恰好在做is null。)

將條件移入on子句。

我想我終於明白了。您試圖區分b.Visibility是否爲NULL並且記錄不存在。對於這一點,你需要一個case聲明:

select v.*, 
     (case when b.ProductId is null then 'Not Marked at All' 
      when b.Visibility is null then 'Marked as NULL' 
      else b.Visibility' 
     end) as Visibility 

我改變所產生弄清楚發生了什麼的字符串。無論你喜歡什麼,你都可以製作。關鍵是使用連接鍵上的條件判斷記錄是否存在,然後查看該值,以檢查值是否存在。

+0

好吧,我可以看到where子句是如何讓我的連接成爲內部連接的,但我沒有關注如何/爲什麼將條件移動到on子句將會修復這些問題。 我的Where子句中包含特定於產品(尺寸形狀顏色等)的東西,並且產品中不存在該行業。 – Jabsy 2013-02-26 17:46:48

+1

@Jabsy。 。 。你必須發佈完整的查詢才能真正獲得幫助。很有可能,在where子句中使用過濾器條件會撤消左外連接,從而導致意外的結果。 – 2013-02-26 17:57:54

+0

更新到完整查詢 – Jabsy 2013-02-26 18:16:05