Wählen Sie count (*) aus mehreren Tabellen

229

Wie kann ich count(*)aus zwei verschiedenen Tabellen auswählen (sie aufrufen tab1und tab2) als Ergebnis:

Count_1   Count_2
123       456

Ich habe das versucht:

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

Aber alles was ich habe ist:

Count_1
123
456
user73118
quelle

Antworten:

327
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
quelle
13
Warum brauchst du Dual? was bedeutet das?
Ray Lu
30
Es ist eine gefälschte Tabelle mit einem Datensatz. Sie können SELECT nicht ohne FROM in Oracle haben.
Quassnoi
3
Dual ist eine Tabelle in Oracle DBs, auf die alle Konten zugreifen können. Sie können sie für allgemeine Anforderungen verwenden, z. B.: "SELECT sysdate FROM dual"
dincerm
5
Es macht keinen Unterschied, Oracle wertet nichts in COUNT (*) aus.
Quassnoi
4
@ Stéphane: Dies passiert, wenn Sie Oracle-Code unter PostgreSQL ausprobieren. Verliere das FROM dual.
Quassnoi
81

Als zusätzliche Information müssen Sie nur den Teil "FROM dual" der Abfrage entfernen, um dasselbe in SQL Server zu erreichen.

dincerm
quelle
1
Ich wollte gerade sagen: "Aber was ist mit MS SQL, als ich Ihren Kommentar sah? Vielen Dank, dass Sie die Notwendigkeit vorweggenommen haben!
Andrew Neely
40

Nur weil es etwas anders ist:

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

Es gibt die transponierten Antworten (eine Zeile pro Tabelle anstelle einer Spalte), ansonsten denke ich nicht, dass es viel anders ist. Ich denke, in Bezug auf die Leistung sollten sie gleichwertig sein.

Mike Woodhouse
quelle
1
Sie sollten UNION ALL besser hierher bringen.
Quassnoi
Welchen Unterschied könnte das Hinzufügen von "ALL" bei drei einzeiligen Abfragen machen? Die Ergebnisse müssen auf jeden Fall gleich sein, oder?
Mike Woodhouse
1
UNION ohne ALLE Gruppenergebnisse. Wenn in Tabelle_1 und Tabelle_2 2 Zeilen und in Tabelle_3 3 Zeilen enthalten sind, erhalten Sie zwei Zeilen in Ihrer Ergebnismenge und können anhand der Ergebnismenge nicht erkennen, wie viele Zeilen Tabelle_2 hat: 2 oder 3.
Quassnoi
4
Ja, aber ich wähle den Tabellennamen aus, wodurch die Ergebnisse eindeutig sind. Sonst wären Sie richtig, aber welchen Wert gäbe es in mehreren Zahlen ohne Kontext? ;-)
Mike Woodhouse
Dies ist auch eine gute Möglichkeit, eine CTE-Anweisung (WITH SELECT) für jede Zählung zu verwenden.
blue_chip
28

Meine Erfahrung ist mit SQL Server, aber können Sie Folgendes tun:

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

In SQL Server erhalte ich das gewünschte Ergebnis.

Nic Wise
quelle
11

Andere etwas andere Methoden:

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
/
David Aldridge
quelle
7

Da ich keine andere Antwort sehen kann, bringen Sie dies zur Sprache.

Wenn Sie keine Unterabfragen mögen und Primärschlüssel in jeder Tabelle haben, können Sie dies tun:

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

Aber was die Leistung betrifft, glaube ich, dass die Lösung von Quassnoi besser ist und die, die ich verwenden würde.

Jimmy Stenke
quelle
7

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

casperOne
quelle
7

Hier ist von mir zu teilen

Option 1 - Zählen von derselben Domain aus verschiedenen Tabellen

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

Option 2 - Zählen von verschiedenen Domänen für dieselbe Tabelle

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

Option 3 - Zählen von verschiedenen Domänen für dieselbe Tabelle mit "Vereinigung alle", um Zählzeilen zu erhalten

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

Genieße das SQL, das mache ich immer :)

Fadzil
quelle
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
Vikas Kumar
quelle
6
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
Jens Schauder
quelle
6

Ein schneller Stich kam mit:

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

Hinweis: Ich habe dies in SQL Server getestet, From Dualist also nicht erforderlich (daher die Diskrepanz).

CJM
quelle
5

Der Vollständigkeit halber erstellt diese Abfrage eine Abfrage, mit der Sie alle Tabellen für einen bestimmten Eigentümer zählen können.

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;

Die Ausgabe ist so etwas wie

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

Was Sie dann ausführen können, um Ihre Zählungen zu erhalten. Es ist nur ein praktisches Skript, das man manchmal haben kann.

Chris Gill
quelle
4

Wenn die Tabellen (oder zumindest eine Schlüsselspalte) vom gleichen Typ sind, machen Sie zuerst die Vereinigung und zählen Sie dann.

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

Oder nehmen Sie Ihre Sättigung und setzen Sie eine andere Summe () darum.

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

quelle
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
Scheich Kawser
quelle
2
Declare @all int
SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2)
Print @all

oder

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)
Rabby Hasan
quelle
0

Verbinden Sie sich mit verschiedenen Tabellen

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

Wählenfield Sie (wählen Sie count ( ) aus tab1, wo wie 'value') + (wählen Sie count ( ) aus tab2, wo fieldwie 'value') count

Krise
quelle
-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
sajid
quelle
Willkommen bei StackOverflow und vielen Dank für die Veröffentlichung. Bitte schauen Sie sich an, wie man antwortet .
Serge Belov
Diese Antwort ist falsch. Union kann nicht verwendet werden (sollte Union all verwenden).
Deadsheep39