Sélectionnez le nombre (*) de plusieurs tables
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
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