2009-03-03 14 views
176

¿Cómo puedo seleccionar count(*) de dos tablas diferentes (los llaman tab1 y tab2) que tienen como resultado:Seleccione la cuenta (*) de varias tablas

Count_1 Count_2 
123  456 

He intentado esto:

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

Pero todo lo que tengo es:

Count_1 
123 
456 

Respuesta

255
SELECT (
     SELECT COUNT(*) 
     FROM tab1 
     ) AS count1, 
     (
     SELECT COUNT(*) 
     FROM tab2 
     ) AS count2 
FROM dual 
+0

Muchas gracias, quassnoi – user73118

+9

¿Por qué necesita dual? ¿Qué significa eso? –

+24

Es una tabla falsa con un registro. No puede tener SELECT sin FROM en Oracle. – Quassnoi

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

Una puñalada rápida ocurrió:

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

Nota: He probado esto en SQL Server, por lo From Dual no es necesario (de ahí la discrepancia).

63

Como información adicional, para lograr lo mismo en SQL Server, solo necesita eliminar la parte "FROM dual" de la consulta.

+0

@ dincer80 gracias por su comentario. –

+0

De nada ... – dincerm

+1

Me estaba preparando para decir "Pero qué pasa con MS SQL, cuando vi su comentario. ¡Gracias por anticipar la necesidad! –

19

Mi experiencia es con SQL Server, pero podría hacer:

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

En SQL Server consigo el resultado que está después.

1

Si las tablas (o al menos una columna de clave) son del mismo tipo, solo haga primero la unión y luego cuente.

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

O tome su decisión y coloque otra suma() a su alrededor.

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

Simplemente porque es ligeramente 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 

Da las respuestas transpuestas (una fila por cada tabla en lugar de una columna), de lo contrario no creo que sea muy diferente. Creo que desde el punto de vista del rendimiento deberían ser equivalentes.

+1

Usted d mejor pongo UNION ALL aquí. – Quassnoi

+0

¿Qué diferencia podría sumar "ALL" con tres consultas de una sola fila? Los resultados deben ser los mismos de todos modos, seguramente? –

+1

UNION sin TODOS los resultados de grupos. Si hay 2 filas en table_1 y table_2, y 3 filas en la tabla_3, obtendrá dos filas en su conjunto de resultados, y no podrá decir desde el conjunto de resultados cuántas filas tiene la tabla_2: 2 o 3. – Quassnoi

7

Otros métodos ligeramente 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 
/
4

Como no puedo ver ninguna otra respuesta plantear esto.

Si que no le gusta sub-consultas y tienen claves primarias en cada tabla que usted puede hacer esto:

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

Pero se refiere a rendimiento creo que la solución de Quassnoi es mejor, y el uno Yo usaría.

3

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

5

Aquí es de mí para compartir

Opción 1 - a contar desde mismo dominio de diferentes mesa de

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

Opción 2 - contando a partir dominio diferente para una misma mesa

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

Opción 3 - contando a partir dominio diferente para una misma mesa con "union all" para tener filas de recuento

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

Disfrute del SQL, siempre lo hago :)

1

Por un poco de integridad - esta consulta creará una consulta para darle un recuento de todas las tablas para un propietario determinado.

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; 

La salida es algo así 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 luego se puede ejecutar para obtener sus cargos. Es solo un guión útil para tener a veces.

-1
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 
+0

Bienvenido a StackOverflow y gracias por publicar. Por favor, eche un vistazo a [Cómo responder] (http://stackoverflow.com/questions/how-to-answer). –

0

JOIN con diferentes tablas

SELECT COUNT(*) FROM ( 
SELECT DISTINCT table_a.ID FROM table_a JOIN table_c ON table_a.ID = table_c.ID ); 
1
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) 
1
--============= 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 
0

seleccione (select count () de Tab1 donde field como 'valor') + (select count () desde donde Sep2 field como 'valor') recuento

2
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