Question

Comment sélectionner count (*) dans 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
Était-ce utile?

La solution

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

Autres conseils

À titre d'information supplémentaire, pour accomplir la même chose dans SQL Server, il vous suffit de supprimer le symbole "FROM dual". une partie de la requête.

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 leur performance devrait être équivalente.

Mon expérience concerne SQL Server, mais pourriez-vous faire:

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

Dans SQL Server, le résultat recherché est celui que vous recherchez.

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
/

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

Si vous n'aimez pas les sous-requêtes et qui 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 ce qui concerne les performances, j'estime que la solution de Quassnoi est la meilleure et celle que j'utiliserais.

select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;

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

Voici de moi à partager

Option 1: compter à partir du même domaine depuis 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 l'option "union all". avoir des rangées de nombre

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

Profitez du SQL, je le fais toujours:)

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

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

Un coup de poignard rapide a abouti à:

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

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

    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

Si les tables (ou au moins une colonne clé) sont du même type, établissez 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 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
)
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)
--============= 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

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   );

sélectionnez (sélectionnez le nombre () dans l'onglet 1 où le champ ressemble à "valeur") + (sélectionnez le nombre () dans l'onglet 2 où le champ ressemble à 'valeur') compter

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top