Selecione contagem (*) de várias tabelas


230

Como posso selecionar count(*)entre duas tabelas diferentes (chamá-las tab1e tab2) tendo como resultado:

Count_1   Count_2
123       456

Eu tentei isso:

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

Mas tudo o que tenho é:

Count_1
123
456

Respostas:


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

14
por que você precisa de dupla? o que isso significa?
Raio Lu

31
É uma mesa falsa com um registro. Você não pode ter o SELECT sem FROM no Oracle.
Quassnoi 03/03/09

3
dual é uma tabela em db Oracle para o qual todas as contas pode acessar você pode usá-lo para as necessidades comuns como: "sysdate SELECT FROM dual"
dincerm

5
Não faz diferença, a Oracle não avaliará nada dentro de COUNT (*).
Quassnoi 03/03/09

4
@ Stéphane: isso acontece quando você tenta o código Oracle no PostgreSQL. Perca o FROM dual.
Quassnoi

81

Como informações adicionais, para realizar a mesma coisa no SQL Server, você só precisa remover a parte "FROM dual" da consulta.


1
Eu estava me preparando para dizer "Mas o que dizer MS SQL, quando vi o seu comentário Obrigado por antecipando a necessidade.!
Andrew Neely

40

Só porque é um pouco diferente:

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á as respostas transpostas (uma linha por tabela em vez de uma coluna), caso contrário, não acho que seja muito diferente. Eu acho que no desempenho eles devem ser equivalentes.


1
É melhor você colocar UNION ALL aqui.
Quassnoi

Que diferença a adição de "TUDO" faz com três consultas de linha única? Os resultados devem ser os mesmos de qualquer maneira, com certeza?
Mike Woodhouse

1
UNIÃO sem TODOS os resultados dos grupos. Se houver 2 linhas na tabela_1 e tabela_2 e 3 linhas na tabela_3, você obterá duas linhas no seu conjunto de resultados e não poderá distinguir do conjunto de resultados quantas linhas a tabela_2 possui: 2 ou 3.
Quassnoi

4
Sim, mas seleciono o nome da tabela, o que torna os resultados exclusivos. Caso contrário, você estaria correto, mas que valor haveria em vários números sem contexto? ;-)
Mike Woodhouse

Essa também é uma boa maneira de usar uma instrução CTE (WITH SELECT) para cada contagem.
blue_chip 16/09

28

Minha experiência é com o SQL Server, mas você pode:

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

No SQL Server, recebo o resultado que você procura.


11

Outros métodos ligeiramente diferentes:

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

Como não vejo outra resposta, trago isso.

Se você não gosta de subconsultas e possui chaves primárias em cada tabela, pode fazer o seguinte:

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

Mas, em termos de desempenho, acredito que a solução da Quassnoi é melhor e a que eu usaria.


7

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


7

Aqui está de mim para compartilhar

Opção 1 - contando do mesmo domínio de tabela diferente

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

Opção 2 - contando de domínio diferente para a mesma tabela

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

Opção 3 - contando de domínio diferente para a mesma tabela com "union all" para ter linhas de contagem

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

Aproveite o SQL, eu sempre faç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

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

6

Uma facada rápida surgiu com:

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

Nota: Eu testei isso no SQL Server, então From Dualnão é necessário (daí a discrepância).


5

Para um pouco de completude - essa consulta criará uma consulta para fornecer uma contagem de todas as tabelas para um determinado proprietário.

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;

A saída é algo como

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 você pode executar para obter suas contagens. Às vezes, é apenas um script útil para se ter por perto.


4

Se as tabelas (ou pelo menos uma coluna-chave) forem do mesmo tipo, basta fazer a união primeiro e depois contar.

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

Ou escolha sua posição e coloque outra soma () em torno dela.

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

ou

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)

0

JOIN com tabelas diferentes

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

0

select (selecione count ( ) na guia 1, fieldcomo "valor") + (selecione count ( ) na guia 2, fieldcomo "valor")


-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

Bem-vindo ao StackOverflow e obrigado por publicar. Por favor, dê uma olhada em Como responder .
Serge Belov

Esta resposta está errada. Não é possível usar union (deve usar union all).
Deadsheep39
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.