web-dev-qa-db-fra.com

Comment faire un compte sur une requête d'union

J'ai la requête suivante:

select distinct profile_id from userprofile_...

union

select distinct profile_id from productions_...

Comment puis-je obtenir le décompte du nombre total de résultats?

34
David542

Si vous voulez un nombre total pour tous les enregistrements, vous feriez ceci:

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

    union all

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

tu devrais utiliser Union All s'il y a des lignes égales dans les deux tables, car Union fait une distinction

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

union ALL

select distinct profile_id from productions_...) x

Dans ce cas, si vous avez le même Profile_Id dans les deux tables (id est probablement un nombre, donc c'est possible), alors si vous utilisez Union, si vous avez Id = 1 dans les deux tables, vous perdrez une ligne (elle apparaîtra une fois au lieu de deux)

17
Gonzalo.-

Cela fonctionnera plutôt bien:

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

L'utilisation de union garantit des valeurs distinctes - union supprime les doublons, union all Les conserve. Cela signifie que vous n'avez pas besoin du mot clé distinct (les autres réponses n'exploitent pas ce fait et finissent par faire plus de travail).

Édité:

Si vous souhaitez totaliser le nombre de différents profile_id dans chacun, où les valeurs données qui apparaissent dans les deux tableaux sont considérées comme différentes, utilisez ceci:

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

Cette requête surpassera toutes les autres réponses, car la base de données peut compter efficacement des valeurs distinctes dans une table beaucoup plus rapidement que dans la liste unifiée. La sum() additionne simplement les deux nombres ensemble.

8
Bohemian

Comme omg poneys a déjà souligné qu'il n'est pas utile d'utiliser distinct avec UNION, vous pouvez utiliser UNION ALL dans votre cas .....

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

Ceux-ci ne fonctionneront pas si dans l'un des COUNT (*) le résultat est égal à 0.

Ça sera mieux:

 SELECT SUM (total) 
 FROM 
 (
 Select COUNT (distinct profile_id) AS total 
 From userprofile _... 
 
 union tout 
 
 sélectionner COUNT (distinct profile_id) COMME total 
 parmi les productions _... 
) x 
3
Jorge

La meilleure solution consiste à ajouter le nombre de deux résultats de requête. Ce ne sera pas un problème si la table contient un grand nombre d'enregistrements. Et vous n'avez pas besoin d'utiliser la requête d'union. Ex:

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