4

以下の SQL ステートメントの違いを説明してくれる人はいますか? 違いがあることはわかりますが、異なる結果を生み出す正確な条件を特定することはできません. ちなみに、すべてのIDがすでに一意であるため、このdistinct句はフィールドに違いをもたらさないと思います。user.idクエリの目的は、一意の (空でない) 姓の数をカウントすることです。姓が空の場合は、一意としてカウントされます。

この問題の一般的なケースは、case-when ステートメント内での集計関数の使用であると思います。

Case-When 内でカウント:

SELECT 
    (case when (substr(u.name,40,40) <> '                                        ')
        then count(distinct(substr(u.name,40,40)))
        else count(u.id) 
    end) as "LAST_NAME",
FROM 
    users u
GROUP BY
    substr(u.name,40,40)

Case-When within Count:

SELECT 
    count (distinct case when (substr(u.name,40,40) <> '                                        ')
        then substr(u.name,40,40)
        else to_char(u.id)
    end) as "LAST_NAME",
FROM 
    users u
GROUP BY
    substr(u.name,40,40)
4

1 に答える 1

3

user.idが の場合PRIMARY KEY、これらのクエリは意味的には同じですが、異なる実行プランが生成される可能性があります。

1グループ内の group-by expession の個別の値をカウントしているため、空でないすべての姓に対して返されます。これは、定義により、正確に 1 になります。

空の姓の場合、最初のクエリは本質的にCOUNT(u.id)を返し、2 番目のクエリは を返します。それが一意であるCOUNT(DISTINCT TO_CHAR(u.id))ことを考えると、同じです。u.id

GROUP BY2番目のクエリから削除する必要があると思います:

SELECT  count (distinct case when (substr(u.name,40,40) <> '                                        ')
        then substr(u.name,40,40)
        else to_char(u.id)
    end) as "LAST_NAME",
FROM 
    users u
于 2012-06-05T18:36:43.433 に答える