2014-05-20 40 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放在一起,尽管它会把你的两个答案放在不同的行中,而不是不同的列。