2012-07-02 24 views
1

我有點新的使用SQL如此忍受我。蜂巢SQL - 煉油JOIN查詢忽略Null值

我有兩個表,每個具有一個ID列。表A有一個標題爲角色的專欄,表B有一個標題爲結果的專欄。我想要查詢這些表以找到基於ID的行具有role ='PS'和outcome ='DE'。這裏是我的代碼:

SELECT count(*) 
FROM A JOIN B 
ON (A.id = B.id 
AND A.role = 'PS' 
AND B.outcome = 'DE') 

我一直在搜索互聯網的方式做到這一點,以便它不包括對任何A.role或B.outcome空值的行。

上面的代碼返回可以說40100,即使條目B中的總數,其中B.outcome =「DE」只有40,000。所以它顯然包括不符合我的條件的條目。有沒有更好的方法來優化我的查詢?

+0

我也試過用IS NOT NULL添加條件,它不會改變輸出。 – t3hclwn

+0

你有沒有檢查那些不應該在那裏的額外返回的行?它們包含什麼? – biziclop

+0

它們似乎都適合我的兼具'A.role =「PS''和'B.outcome =」 DE'' – t3hclwn

回答

0

您的查詢已經排除了在A.role一個null值的行。畢竟,null = 'PS'是不正確的,你正在使用內部連接。

有如何可以從加入以外還有B.獲取更多的行一個簡單的解釋說你有這些行對於A:

A.id A.role 
1  'A' 
1  'A' 

而且這些行對B:

B.id B.outcome 
1  'A' 
1  'A' 

那麼這個查詢:

select * 
from A 
join B 
on  A.id = B.id and A.role = 'A' and B.role = 'A' 

將返回4行。這比表A或B還要多!

所以我調查id是否是唯一的:

select count(*) from A group by id having count(*) > 1 
select count(*) from B group by id having count(*) > 1 

如果這些查詢返回的計數大於零,id不是唯一的。由於連接爲每個匹配重複行,這將解釋返回記錄數量的大幅增加。

+0

感謝您的幫助Andomar的描述!我想我現在明白了。我運行了你的測試代碼,它顯示'id'不是唯一的。有沒有一種方法可以獲得獨特的記錄,也就是說,我能得到一個跳過多餘「ID」的計數? – t3hclwn

+1

對於唯一的計數,請嘗試''從A'選擇計數(獨特ID) – Andomar

+0

謝謝!這給了我一個更有意義的計數。 – t3hclwn