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
SELECT (
SELECT COUNT(*)
FROM tab1
) AS count1,
(
SELECT COUNT(*)
FROM tab2
) AS count2
FROM dual
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.
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.
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
/
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.
SELECT (SELECT COUNT(*) FROM table1) + (SELECT COUNT(*) FROM table2) FROM dual;
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
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 :)
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.
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).
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, 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
)
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 );
select (select count () de tab1 où field
like 'valeur') + (select count () de tab2 où field
like 'valeur').