web-dev-qa-db-ja.com

ユニオンクエリでカウントを行う方法

次のクエリがあります。

select distinct profile_id from userprofile_...

union

select distinct profile_id from productions_...

結果の総数のカウントを取得するにはどうすればよいですか?

34
David542

すべてのレコードの合計数が必要な場合は、次のようにします。

SELECT COUNT(*)
FROM
(
    select distinct profile_id 
    from userprofile_...

    union all

    select distinct profile_id 
    from productions_...
) x
61
Taryn

unionが明確にするため、両方のテーブルに等しい行がある場合はUnion Allを使用する必要があります

select count(*) from 
(select distinct profile_id from userprofile_...

union ALL

select distinct profile_id from productions_...) x

この場合、両方のテーブルで同じProfile_Idを取得した場合(idはおそらく数値なので、可能です)、Unionを使用した場合、両方でId = 1を取得した場合tables、1行失われます(2行ではなく1回表示されます)

17
Gonzalo.-

これはかなりうまく機能します。

_select count(*) from (
    select profile_id
    from userprofile_...
    union
    select profile_id
    from productions_...
) x
_

unionを使用すると、異なる値が保証されます-unionは重複を削除し、_union all_はそれらを保持します。これは、distinctキーワードが不要であることを意味します(他の回答はこの事実を利用せず、結果としてより多くの作業を行うことになります)。

編集済み:

両方のテーブルに表示される特定の値がdifferent値と見なされる場合、それぞれの異なるprofile_idの合計数を求める場合は、これを使用します。

_select sum(count) from (
    select count(distinct profile_id) as count
    from userprofile_...
    union all
    select count(distinct profile_id)
    from productions_...
) x
_

データベースは、ユニオンリストからよりもはるかに高速にテーブル内の個別の値を効率的にカウントできるため、このクエリは他のすべての回答よりも優れています。 sum()は、単に2つのカウントを加算します。

8
Bohemian

Omgポニーは、UNIONでdistinctを使用する方法がないことを既に指摘しているので、あなたの場合はUNION ALLを使用できます。

SELECT COUNT(*) 
FROM 
( 
select distinct profile_id from userprofile_...
union all
select distinct profile_id from productions_...
) AS t1 
5
Akash KC

COUNT(*)のいずれかで結果が0に等しい場合、これらは機能しません。

これは改善されます:

 SELECT SUM(total)
 FROM 
(
 select COUNT(distinct profile_id)AS total 
 from userprofile _... 
 
 union all 
 
 COUNT(distinct profile_id)AS total 
 from productions _... 
)x 
を選択します
3
Jorge

最善の解決策は、2つのクエリ結果のカウントを追加することです。テーブルに多数のレコードが含まれていても問題はありません。また、ユニオンクエリを使用する必要はありません。例:

SELECT (select COUNT(distinct profile_id) from userprofile_...) + 
(select COUNT(distinct profile_id) from productions_...) AS total
3
Paulson Peter