Sélectionnez le nombre (*) de plusieurs tables

230

Comment puis-je choisir count(*)parmi deux tables différentes (appelez-les tab1et tab2) ayant comme 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
user73118
la source

Réponses:

328
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
la source
14
pourquoi avez-vous besoin de double? Qu'est-ce que ça veut dire?
Ray Lu
31
C'est une fausse table avec un enregistrement. Vous ne pouvez pas avoir SELECT sans FROM dans Oracle.
Quassnoi
3
dual est une table dans la base de données oracle à laquelle tous les comptes peuvent accéder, vous pouvez l'utiliser pour des besoins communs comme: "SELECT sysdate FROM dual"
dincerm
5
Cela ne fait aucune différence, Oracle n'évaluera rien dans COUNT (*).
Quassnoi
4
@ Stéphane: cela se produit lorsque vous essayez du code Oracle sur PostgreSQL. Perdez le FROM dual.
Quassnoi
81

Comme information supplémentaire, pour accomplir la même chose dans SQL Server, il vous suffit de supprimer la partie "FROM dual" de la requête.

Dincerm
la source
1
Je m'apprêtais juste à dire "Mais qu'en est-il de MS SQL, quand j'ai vu votre commentaire. Merci d'avoir anticipé le besoin!
Andrew Neely
40

Tout simplement 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 que sur le plan des performances, ils devraient être équivalents.

Mike Woodhouse
la source
1
Vous feriez mieux de mettre UNION ALL ici.
Quassnoi
Quelle différence pourrait ajouter "TOUT" avec trois requêtes sur une seule ligne? Les résultats doivent être les mêmes de toute façon, sûrement?
Mike Woodhouse
1
UNION sans TOUS les résultats des groupes. S'il y a 2 lignes dans table_1 et table_2 et 3 lignes dans 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 table_2 a: 2 ou 3.
Quassnoi
4
Oui, mais je sélectionne le nom de la table, ce qui rend les résultats uniques. Sinon, vous auriez raison, mais quelle valeur y aurait-il dans plusieurs chiffres sans contexte? ;-)
Mike Woodhouse
C'est également un bon moyen d'utiliser une instruction CTE (WITH SELECT) pour chaque comptage.
blue_chip
28

Mon expérience est avec SQL Server, mais pourriez-vous 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.

Nic Wise
la source
11

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
/
David Aldridge
la source
7

Comme je ne vois aucune autre réponse à ce sujet.

Si vous n'aimez pas les sous-requêtes et avez des clés primaires dans chaque table, vous pouvez le faire:

select count(distinct tab1.id) as count_t1,
       count(distinct tab2.id) as count_t2
    from tab1, tab2

Mais en termes de performances, je pense que la solution de Quassnoi est meilleure et celle que j'utiliserais.

Jimmy Stenke
la source
7

SELECT (SELECT COUNT(*) FROM table1) + (SELECT COUNT(*) FROM table2) FROM dual;

casperOne
la source
7

Voici de moi à partager

Option 1 - compter à partir du même domaine à partir d'une table différente

select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain1.table2) "count2" 
from domain1.table1, domain1.table2;

Option 2 - compter à partir d'un domaine différent pour la même table

select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain2.table1) "count2" 
from domain1.table1, domain2.table1;

Option 3 - compter à partir d'un domaine différent pour la même table avec "union all" pour avoir des lignes de compte

select 'domain 1'"domain", count(*) 
from domain1.table1 
union all 
select 'domain 2', count(*) 
from domain2.table1;

Profitez du SQL, je le fais toujours :)

Fadzil
la source
7
    select 
    t1.Count_1,t2.Count_2
    from 
(SELECT count(1) as Count_1 FROM tab1) as t1, 
(SELECT count(1) as Count_2 FROM tab2) as t2
Vikas Kumar
la source
6
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
Jens Schauder
la source
6

Un coup de couteau rapide est venu avec:

Select (select count(*) from Table1) as Count1, (select count(*) from Table2) as Count2

Remarque: J'ai testé cela dans SQL Server, ce From Dualn'est donc pas nécessaire (d'où la différence).

CJM
la source
5

Pour un peu d'exhaustivité - cette requête créera une requête pour vous donner un compte de toutes les tables pour un propriétaire donné.

select 
  DECODE(rownum, 1, '', ' UNION ALL ') || 
  'SELECT ''' || table_name || ''' AS TABLE_NAME, COUNT(*) ' ||
  ' FROM ' || table_name  as query_string 
 from all_tables 
where owner = :owner;

La sortie est quelque chose comme

SELECT 'TAB1' AS TABLE_NAME, COUNT(*) FROM TAB1
 UNION ALL SELECT 'TAB2' AS TABLE_NAME, COUNT(*) FROM TAB2
 UNION ALL SELECT 'TAB3' AS TABLE_NAME, COUNT(*) FROM TAB3
 UNION ALL SELECT 'TAB4' AS TABLE_NAME, COUNT(*) FROM TAB4

Que vous pouvez ensuite exécuter pour obtenir vos comptes. C'est juste un script pratique à avoir parfois.

Chris Gill
la source
4

Si les tables (ou au moins une colonne clé) sont du même type, effectuez d'abord l'union, puis comptez.

select count(*) 
  from (select tab1key as key from schema.tab1 
        union all 
        select tab2key as key from schema.tab2
       )

Ou prenez votre satisfaction et mettez une autre somme () autour d'elle.

select sum(amount) from
(
select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2
)

la source
3
--============= FIRST WAY (Shows as Multiple Row) ===============
SELECT 'tblProducts' [TableName], COUNT(P.Id) [RowCount] FROM tblProducts P
UNION ALL
SELECT 'tblProductSales' [TableName], COUNT(S.Id) [RowCount] FROM tblProductSales S


--============== SECOND WAY (Shows in a Single Row) =============
SELECT  
(SELECT COUNT(Id) FROM   tblProducts) AS ProductCount,
(SELECT COUNT(Id) FROM   tblProductSales) AS SalesCount
Sheikh Kawser
la source
2
Declare @all int
SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2)
Print @all

ou

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)
Rabby Hasan
la source
0

JOINDRE avec différentes tables

SELECT COUNT(*) FROM (  
SELECT DISTINCT table_a.ID  FROM table_a JOIN table_c ON table_a.ID  = table_c.ID   );
zloctb
la source
0

sélectionnez (sélectionnez count ( ) dans tab1 où fieldcomme 'value') + (sélectionnez count ( ) dans tab2 où fieldcomme 'value') count

Cris
la source
-2
select @count = sum(data) from
(
select count(*)  as data from #tempregion
union 
select count(*)  as data from #tempmetro
union
select count(*)  as data from #tempcity
union
select count(*)  as data from #tempzips
) a
sajid
la source
Bienvenue sur StackOverflow et merci pour la publication. Veuillez consulter Comment répondre .
Serge Belov
Cette réponse est fausse. Impossible d'utiliser union (doit utiliser union all).
Deadsheep39