我有两个查询来计算数据:
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
当我这样做时,与单独执行的查询相比,这两个计数都是错误的。
为什么会这样,我真的很困惑。解决方案可能很简单,但我现在真的没有任何线索。
答案 0 :(得分: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;
答案 1 :(得分:0)
INNER JOIN
就像一个十字路口。第一个查询是计算表y.id
中y.otherId
的所有不同x
,但z
中没有必要。第二个是z.id
,z.otherId
位于x
,但不一定位于y
。第三个合并查询将全部为y.id
,y.otherId
位于x和z.otherId
中,反之亦然。
如果您想要两个计数,您可以随时将它们与UNION
放在一起,但它会将您的两个答案放在不同的行中,而不是不同的列。