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

Comment puis-je sélectionner count(*) à partir de deux tables différentes (appelez-les tab1 et tab2 ) ayant comme 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
186
demandé sur Mark 2009-03-03 15:37:06

18 réponses

SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
269
répondu Quassnoi 2009-03-05 09:52:36

comme information supplémentaire, pour accomplir la même chose dans SQL Server, vous avez juste besoin de supprimer la partie" du dual " de la requête.

68
répondu dincerm 2011-08-18 21:44:44

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 que du point de vue de la performance, ils devraient être équivalents.

30
répondu Mike Woodhouse 2009-03-03 16:51:29

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.

22
répondu Nic Wise 2009-03-03 12:45:31

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
répondu David Aldridge 2009-03-03 20:25:18

car je ne vois pas d'autre réponse.

si vous n'aimez pas les sous-requêtes et ont des clés primaires dans chaque table vous pouvez faire ceci:

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

mais la performance sage je crois que la solution de Quassnoi est meilleure, et celui que j'utiliserais.

6
répondu Jimmy Stenke 2009-03-05 10:09:26

Ici est de moi à part

Option 1 - comptage à 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 - compte de domaine différent pour une même table

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

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

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

Profiter de la SQL, j' toujours faire :)

5
répondu Fadzil 2012-02-24 17:27:04
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
4
répondu Jens Schauder 2009-03-03 12:39:54

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

4
répondu casperOne 2012-01-11 13:21:53

un coup rapide est venu avec:

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

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

3
répondu CJM 2011-08-18 21:43:55
    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
répondu Vikas Kumar 2017-06-02 22:07:27

si les tableaux (ou au moins une colonne clé) sont du même type, il suffit de faire d'abord l'union et ensuite compter.

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

ou prenez votre siège 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
répondu 2009-03-03 12:47:27

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

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 courir pour obtenir vos comptes. C'est juste un script pratique à avoir dans le coin parfois.

1
répondu Chris Gill 2011-08-18 21:46:48
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
répondu Rabby Hasan 2016-08-03 19:14:06
--============= 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
répondu Sheikh Kawser 2017-04-28 12:11:30

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   );
0
répondu zloctb 2015-08-16 05:35:20

sélectionner (sélectionnez count ( ) à partir de l'onglet 1 où field comme "valeur") + (sélectionnez count ( ) à partir de tab2 où field comme "valeur") compte

0
répondu Cris 2017-05-24 20:11:04
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
-1
répondu sajid 2011-06-25 01:10:40