314 votes

Sélectionnez count(*) à partir de plusieurs tables

Comment puis-je sélectionner count(*) à partir de deux tables différentes (appelez-les tab1 et tab2 ) ayant pour résultat :

Count_1   Count_2
123       456

J'ai essayé ça :

select count(*) Count_1 from schema.tab1 union all select count(*) Count_2 from schema.tab2

Mais tout ce que j'ai, c'est :

Count_1
123
456

444voto

Quassnoi Points 191041
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual

22 votes

Pourquoi avez-vous besoin d'un double ? qu'est-ce que ça veut dire ?

36 votes

C'est une fausse table avec un seul enregistrement. On ne peut pas avoir SELECT sans FROM dans Oracle.

3 votes

Dual est une table dans les bases de données oracle à laquelle tous les comptes peuvent accéder vous pouvez l'utiliser pour des besoins communs comme : "SELECT sysdate FROM dual"

102voto

dincer80 Points 652

À titre d'information complémentaire, pour accomplir la même chose en SQL Server, il suffit de supprimer la partie "FROM dual" de la requête.

3 votes

Je m'apprêtais à dire "Mais qu'en est-il de MS SQL" quand j'ai vu votre commentaire. Merci d'avoir anticipé le besoin !

67voto

Mike Woodhouse Points 27748

Juste parce que c'est légèrement différent :

SELECT 'table_1' AS table_name, COUNT(*) FROM table_1
UNION
SELECT 'table_2' AS table_name, COUNT(*) FROM table_2
UNION
SELECT 'table_3' AS table_name, COUNT(*) FROM table_3

Il donne les réponses transposées (une ligne par tableau au lieu d'une colonne), sinon je ne pense pas que ce soit très différent. Je pense qu'en termes de performances, elles devraient être équivalentes.

2 votes

Tu ferais mieux de mettre UNION ALL ici.

0 votes

Quelle différence l'ajout de "ALL" pourrait-il faire avec trois requêtes à ligne unique ? Les résultats doivent être les mêmes dans les deux cas, n'est-ce pas ?

1 votes

UNION sans les résultats de TOUS les groupes. S'il y a 2 lignes dans la table_1 et la table_2, et 3 lignes dans la table_3, vous obtiendrez deux lignes dans votre jeu de résultats, et vous ne pourrez pas dire à partir du jeu de résultats combien de lignes contient la table_2 : 2 ou 3.

36voto

Nic Wise Points 4722

J'ai de l'expérience avec SQL Server, mais vous pourriez le faire :

select (select count(*) from table1) as count1,
  (select count(*) from table2) as count2

Dans SQL Server, j'obtiens le résultat que vous recherchez.

20voto

David Aldridge Points 27624

D'autres méthodes légèrement différentes :

with t1_count as (select count(*) c1 from t1),
     t2_count as (select count(*) c2 from t2)
select c1,
       c2
from   t1_count,
       t2_count
/

select c1,
       c2
from   (select count(*) c1 from t1) t1_count,
       (select count(*) c2 from t2) t2_count
/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X