Respostas:
SELECT (
SELECT COUNT(*)
FROM tab1
) AS count1,
(
SELECT COUNT(*)
FROM tab2
) AS count2
FROM dual
FROM dual
.
Como informações adicionais, para realizar a mesma coisa no SQL Server, você só precisa remover a parte "FROM dual" da consulta.
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.
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
/
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.
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 :)
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
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
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.
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
)
--============= 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
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)
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