web-dev-qa-db-fra.com

Sélectionnez le nombre (*) 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é ceci:

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
192
user73118
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
276
Quassnoi

En guise d'informations supplémentaires, pour accomplir la même chose dans SQL Server, il vous suffit de supprimer la partie "FROM dual" de la requête.

72
dincerm

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 table au lieu d'une colonne), sinon je ne pense pas que ce soit très différent. Je pense que leur performance devrait être équivalente.

30
Mike Woodhouse

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, je reçois le résultat que vous recherchez.

23
Nic Wise

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

Comme je ne vois pas d'autre réponse, apportez ceci.

Si vous n'aimez pas les sous-requêtes et ont 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’aimerais utiliser.

6
Jimmy Stenke

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

6
DR Hussein Khidhr
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
5
Jens Schauder

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 tout" pour avoir des lignes de comptage

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

Profitez de la SQL, je fais toujours :)

5
Fadzil

Pour un peu d'exhaustivité, cette requête créera une requête pour vous donner le nombre total de 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.

4
Chris Gill

Un coup de poignard rapide est venu avec:

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

Remarque: j'ai testé cela avec SQL Server, donc From Dual n'est pas nécessaire (d'où la divergence).

3
CJM
    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
3
Vikas Kumar

Si les tables (ou au moins une colonne clé) sont du même type, commencez par créer l'union, puis comptez.

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

Ou bien prenez votre satement et mettez une autre somme () autour.

select sum(amount) from
(
select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2
)
1
Kay Marczinzik
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)
1
Rabby Hasan
--============= 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
1
Sheikh Kawser

JOIN 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   );
0
zloctb

select (select count () de tab1 où field like 'valeur') + (select count () de tab2 où field like 'valeur').

0
Cris