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
18 réponses
SELECT (
SELECT COUNT(*)
FROM tab1
) AS count1,
(
SELECT COUNT(*)
FROM tab2
) AS count2
FROM dual
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.
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.
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.
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
/
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.
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 :)
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;
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).
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 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
)
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.
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
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 );
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
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