0

一个查询会产生一个特定的数字。查询是:

select
count(distinct case when (A or B or C) and D then table_a.field1 else null end)
from table_a
    left join table_b on table_b.x = table_a.y
group by table_a.y
;

其中 A、B、C 和 D 是给定的条件。现在,写成这样的形式:

select
sum((select count(1) from table_b where table_b.x = table_a.y and ((A or B or C) and D) ))
from table_a
    left join table_b on table_b.x = table_a.y
group by table_a.y
;

结果与我们使用 count(distinct) 得到的结果不匹配。

用子查询编写 count(distinct) 的正确方法是什么?

4

1 回答 1

0

完全不清楚为什么需要子查询。您仍然拥有 JOIN,因此子查询可能会多次“计数”相同的行。

如果您想获得满足一组条件(在 table_a 上)的不同值的数量field1table_a那么您实际上不需要 table_b 上的子查询来获得它。至少,无论如何我看不到您可以使用 table_b 上的子查询获得该结果。

这是一个返回等效结果的示例:

 select (select sum(1) as mycount
           from ( select a.field1 
                    from table_a a
                    left join table_b on table_b.x = a.y
                   where a.y = t.y
                     and ( (A or B or C) and D )
                     and a.field1 IS NOT NULL
                   group by a.field1
                ) s
        ) as mycount
   from table_a t
  group by t.y

这真的是我所知道的获得等同于 a 的唯一方法COUNT(DISTINCT expr)。你必须做 a SELECT expr FROM ... WHERE expr IS NOT NULL GROUP BY expr,然后计算它返回的行数。在这种情况下,您可以使用 COUNT(1) 或 SUM(1)。

(我完全不确定这能回答你问的问题,但这是我最好的选择。)

(我们注意到,在您的原始查询中,您有一个GROUP BY table_a.y, 以便查询可以返回多行,每行都有自己的计数。

于 2012-07-11T19:14:15.657 回答