Seleziona il conteggio (*) da più tabelle

Come posso selezionare count(*) da due tabelle diverse (chiamiamole tab1 e tab2 ) avendo come risultato:

 Count_1 Count_2 123 456 

Ho provato questo:

 select count(*) Count_1 from schema.tab1 union all select count(*) Count_2 from schema.tab2 

Ma tutto ciò che ho è:

 Count_1 123 456 

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

Come informazioni aggiuntive, per realizzare la stessa cosa in SQL Server, è sufficiente rimuovere la parte “FROM duale” della query.

Solo perché è leggermente diverso:

 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 

Dà le risposte trasposte (una riga per tabella invece di una colonna), altrimenti non penso sia molto diverso. Penso che le prestazioni dovrebbero essere equivalenti.

La mia esperienza è con SQL Server, ma potresti fare:

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

In SQL Server ottengo il risultato desiderato.

Altri metodi leggermente diversi:

 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 / 

Poiché non riesco a vedere nessuna altra risposta, porta questo.

Se non ti piacciono le sotto-query e hai le chiavi primarie in ogni tabella puoi farlo:

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

Ma per quanto riguarda le prestazioni, credo che la soluzione di Quassnoi sia migliore e quella che userei.

Ecco da parte mia da condividere

Opzione 1: conteggio dallo stesso dominio da una tabella diversa

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

Opzione 2: conteggio da domini diversi per la stessa tabella

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

Opzione 3: contare da domini diversi per la stessa tabella con “unione tutti” per avere righe di conteggio

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

Goditi l’SQL, lo faccio sempre 🙂

 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;

Una pugnalata rapida si avvicinò con:

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

Nota: ho provato questo in SQL Server, quindi From Dual non è necessario (da qui la discrepanza).

  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 

Se le tabelle (o almeno una colonna chiave) sono dello stesso tipo, fai prima l’unione e poi conta.

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

Oppure prendi la tua affermazione e metti un’altra sum () attorno ad essa.

 select sum(amount) from ( select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2 ) 

Per un po ‘di completezza – questa query creerà una query per darti un conteggio di tutte le tabelle per un determinato proprietario.

 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; 

L’output è qualcosa di simile

 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 

Che puoi quindi eseguire per ottenere i tuoi conteggi. È solo un comodo script da avere a volte a volte.

 Declare @all int SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2) Print @all 

o

 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 

ISCRIVITI a tavoli diversi

 SELECT COUNT(*) FROM ( SELECT DISTINCT table_a.ID FROM table_a JOIN table_c ON table_a.ID = table_c.ID ); 

seleziona (seleziona count ( ) da tab1 dove field come ‘value’) + (seleziona count ( ) da tab2 dove field come ‘valore’) conta

 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