2014-05-20 74 views
0

我有兩個查詢計數數據:兩次與計數SELECT查詢到一個查詢

SELECT x.Id, COUNT(DISTINCT y.Id) 
FROM X x 
INNER JOIN Y y ON x.Id = y.otherId 


SELECT x.Id, COUNT(DISTINCT z.Id) 
FROM X x 
INNER JOIN Z z ON x.Id = z.otherId 

兩個查詢返回正確的值執行已分離時。

但我想這些查詢相結合,一個單一的查詢:

SELECT x.Id, COUNT(DISTINCT y.Id), COUNT(DISTINCT z.Id) 
FROM X x 
INNER JOIN Y y ON x.Id = y.otherId 
INNER JOIN Z z ON x.Id = z.otherId 

當我做到這一點,相比於單獨執行的查詢時,這兩個方面都是錯誤的。

爲什麼會發生這種情況,我真的很困惑。解決辦法可能很簡單,但我現在還沒有任何線索。

回答

6

inner join正在過濾出與兩個表中的值都不匹配的值。做你想做什麼,可以使用left outer join

SELECT x.Id, COUNT(DISTINCT y.Id), COUNT(DISTINCT z.Id) 
FROM X x 
LEFT JOIN Y y ON x.Id = y.otherId 
LEFT JOIN Z z ON x.Id = z.otherId ; 

我告誡這種做法,因爲它產生的中間結果是匹配值的兩個表中的數字的笛卡爾積(爲x.ID給定值) 。相反,您可以使用子查詢。這裏是一個使用嵌套子查詢的例子

select x.id, 
     (select count(distinct y.id) from y where x.id = y.otherId), 
     (select count(distinct z.id) from z where x.id = z.otherid) 
from x; 
+0

你好,爲什麼inner join會過濾出兩個表中不匹配的值?例如,我使用x.Id = y.otherId,這應該得到匹配的值,不是嗎? – Swag

+1

@ y451n。 。 。一些'x.id'在'y'表中有匹配;有些在'z'表中有匹配。一些在兩個,但一些只在一個。通過內連接,您只能在兩個表中獲得匹配。 –

0

INNER JOIN就像一個交集。第一個查詢是計算所有不同的y.id,它們在表x中有y.otherId,但在z中沒有必要。第二種全部不同z.id其中z.otherIdx中,但不一定在y中。第三,組合查詢將全部爲y.id,因此y.otherId在x和z.otherId中,反之亦然。

如果你想要兩種計數,你總是可以把它們與UNION放在一起,儘管它會把你的兩個答案放在不同的行中,而不是不同的列。