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)。を実行してから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 に答える