Seleziona conteggio (*) da più tabelle


230

Come posso selezionare count(*)tra due diverse tabelle (chiamarle tab1e 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 quello che ho è:

Count_1
123
456

Risposte:


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

14
perché hai bisogno del doppio? cosa significa?
Ray Lu

31
È un tavolo falso con un record. Non puoi avere SELECT senza FROM in Oracle.
Quassnoi,

3
dual è una tabella in Oracle DB a cui tutti gli account possono accedere è possibile utilizzarlo per esigenze comuni come: "SELEZIONA sysdate FROM dual"
dincerm

5
Non fa differenza, Oracle non valuterà nulla all'interno di COUNT (*).
Quassnoi,

4
@ Stéphane: questo succede quando provi il codice Oracle su PostgreSQL. Perdere il FROM dual.
Quassnoi,

81

Per ulteriori informazioni, per ottenere lo stesso risultato in SQL Server, è sufficiente rimuovere la parte "DA doppia" della query.


1
Mi stavo solo preparando per dire "Ma per quanto riguarda MS SQL, quando ho visto il tuo commento. Grazie per aver anticipato la necessità!
Andrew Neely,

40

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

Fornisce le risposte trasposte (una riga per tabella anziché una colonna), altrimenti non penso che sia molto diverso. Penso che dal punto di vista delle prestazioni dovrebbero essere equivalenti.


1
Faresti meglio a mettere UNION ALL qui.
Quassnoi,

Che differenza potrebbe fare l'aggiunta di "ALL" con tre query a riga singola? I risultati devono essere uguali in entrambi i modi, sicuramente?
Mike Woodhouse,

1
UNION senza TUTTI i risultati dei gruppi. Se ci sono 2 righe in table_1 e table_2 e 3 righe in table_3, otterrai due righe nel tuo set di risultati e non sarai in grado di dire dal set di risultati quante righe ha table_2: 2 o 3.
Quassnoi

4
Sì, ma seleziono il nome della tabella, il che rende i risultati unici. Altrimenti avresti ragione, ma quale valore ci sarebbe in più numeri senza contesto? ;-)
Mike Woodhouse,

Questo è anche un buon modo per usare un'istruzione CTE (WITH SELECT) per ogni conteggio.
blue_chip

28

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 che stai cercando.


11

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
/

7

Come non vedo nessun'altra risposta, solleva questo.

Se non ti piacciono le sottoquery 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.


7

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


7

Ecco da me 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 un dominio diverso 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: conteggio da un dominio diverso per la stessa tabella con "unione tutto" 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 :)


7
    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

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

6

Una rapida pugnalata ha prodotto:

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

Nota: l'ho provato in SQL Server, quindi From Dualnon è necessario (quindi la discrepanza).


5

Per un po 'di completezza, questa query creerà una query per fornire 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. A volte è solo uno script utile da avere.


4

Se le tabelle (o almeno una colonna chiave) sono dello stesso tipo, crea 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 sazietà e metti un'altra somma () attorno ad essa.

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

3
--============= 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

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

0

UNISCITI a tabelle diverse

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

0

seleziona (seleziona count ( ) da tab1 dove fieldlike 'value') + (seleziona count ( ) da tab2 dove fieldlike 'value') count


-2
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

Benvenuto in StackOverflow e grazie per la pubblicazione. Dai un'occhiata a Come rispondere .
Serge Belov,

Questa risposta è sbagliata Impossibile usare l'unione (dovrebbe usare l'unione tutto).
Deadsheep39,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.