Wybierz liczbę (*) z wielu tabel

229

Jak mogę wybrać count(*)z dwóch różnych tabel (wywołać je tab1i tab2) mając w rezultacie:

Count_1   Count_2
123       456

Próbowałem tego:

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

Ale wszystko co mam to:

Count_1
123
456
użytkownik73118
źródło

Odpowiedzi:

327
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
źródło
14
dlaczego potrzebujesz podwójnego? co to znaczy?
Ray Lu
31
To fałszywy stół z jedną płytą. Nie możesz mieć WYBORU bez FROM w Oracle.
Quassnoi
3
dual jest tabelą w bazach danych Oracle, do której mają dostęp wszystkie konta, możesz z niej korzystać do typowych potrzeb, takich jak: „WYBIERZ sysdate z dual”
dincerm
5
Nie ma znaczenia, Oracle nie oceni niczego w COUNT (*).
Quassnoi
4
@ Stéphane: dzieje się tak, gdy próbujesz kodu Oracle na PostgreSQL. Strać FROM dual.
Quassnoi
81

Jako dodatkowe informacje, aby osiągnąć to samo w SQL Server, wystarczy usunąć część zapytania „z podwójnego”.

dincerm
źródło
1
Właśnie przygotowywałam się do powiedzenia „Ale co z MS SQL, kiedy zobaczyłam twój komentarz. Dziękuję za przewidywanie potrzeby!
Andrew Neely
40

Tylko dlatego, że jest nieco inny:

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

Daje transponowane odpowiedzi (jeden wiersz na tabelę zamiast jednej kolumny), w przeciwnym razie nie sądzę, że jest inaczej. Myślę, że pod względem wydajności powinny one być równoważne.

Mike Woodhouse
źródło
1
Lepiej umieść tutaj UNION ALL.
Quassnoi
Jaką różnicę może dodać „WSZYSTKO” przy trzech zapytaniach jednorzędowych? Na pewno wyniki muszą być takie same?
Mike Woodhouse,
1
UNIA bez wyników WSZYSTKICH grup. Jeśli w tabeli_1 i tabeli_2 są 2 wiersze i 3 w tabeli_3, otrzymasz dwa wiersze w zestawie wyników i nie będziesz w stanie stwierdzić z zestawu wyników, ile wierszy ma tabela_2: 2 lub 3.
Quassnoi
4
Tak, ale wybieram nazwę tabeli, co sprawia, że ​​wyniki są unikalne. W przeciwnym razie miałbyś rację, ale jaka byłaby wartość w kilku liczbach bez kontekstu? ;-)
Mike Woodhouse
Jest to również dobry sposób na użycie instrukcji CTE (WITH SELECT) dla każdej liczby.
blue_chip
28

Moje doświadczenie dotyczy SQL Server, ale czy możesz:

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

W SQL Server otrzymuję wynik, którego szukasz.

Nic Wise
źródło
11

Inne nieco inne metody:

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
źródło
7

Ponieważ nie widzę żadnej innej odpowiedzi na to pytanie.

Jeśli nie lubisz sub-zapytań i masz klucze podstawowe w każdej tabeli, możesz to zrobić:

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

Ale jeśli chodzi o wydajność, uważam, że rozwiązanie Quassnoi jest lepsze i tego chciałbym użyć.

Jimmy Stenke
źródło
7

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

casperOne
źródło
7

Oto ode mnie do udostępnienia

Opcja 1 - liczenie z tej samej domeny z innej tabeli

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

Opcja 2 - liczenie z innej domeny dla tej samej tabeli

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

Opcja 3 - liczenie z innej domeny dla tej samej tabeli z „zjednoczeniem wszystkich”, aby mieć wiersze liczenia

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

Korzystaj z SQL, zawsze to robię :)

Fadzil
źródło
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
źródło
6
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
Jens Schauder
źródło
6

Wymyślił szybkie dźgnięcie:

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

Uwaga: Przetestowałem to w SQL Server, więc From Dualnie jest to konieczne (stąd rozbieżność).

CJM
źródło
5

Dla odrobiny kompletności - to zapytanie utworzy zapytanie, które da ci liczbę wszystkich tabel dla danego właściciela.

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;

Wynik jest podobny

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

Które możesz następnie uruchomić, aby uzyskać swoje rachunki. Czasami jest to po prostu przydatny skrypt.

Chris Gill
źródło
4

Jeśli tabele (lub przynajmniej kolumna klucza) są tego samego typu, po prostu utwórz związek, a następnie policz.

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

Lub weź swoje sytowanie i umieść wokół niego kolejną sumę ().

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

źródło
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
Szejk Kawser
źródło
2
Declare @all int
SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2)
Print @all

lub

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)
Rabby Hasan
źródło
0

DOŁĄCZ z różnymi tabelami

SELECT COUNT(*) FROM (  
SELECT DISTINCT table_a.ID  FROM table_a JOIN table_c ON table_a.ID  = table_c.ID   );
zloctb
źródło
0

wybierz (wybierz liczbę ( ) z zakładki 1 gdzie fieldjak „wartość”) + (wybierz liczbę ( ) z zakładki 2 gdzie fieldjak „wartość”) licz

Cris
źródło
-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
źródło
Witamy w StackOverflow i dziękuję za wysyłkę. Proszę spojrzeć na Jak odpowiedzieć .
Serge Belov
Ta odpowiedź jest zła. Nie można użyć unii (należy użyć unii wszystkich).
Deadsheep39