Seleccione el recuento (*) de varias tablas


230

¿Cómo puedo seleccionar count(*)entre dos tablas diferentes (llamarlas tab1y tab2) teniendo como resultado:

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

Respuestas:


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

14
¿Por qué necesitas dual? ¿Qué significa eso?
Ray Lu

31
Es una mesa falsa con un registro. No puede tener SELECT sin FROM en Oracle.
Quassnoi 03 de

3
dual es una tabla en Oracle db's a la que todas las cuentas pueden acceder, puede usarla para necesidades comunes como: "SELECCIONE sysdate FROM dual"
dincerm 03 de

55
No hay diferencia, Oracle no evaluará nada dentro de COUNT (*).
Quassnoi 03 de

44
@ Stéphane: esto sucede cuando prueba el código Oracle en PostgreSQL. Perder el FROM dual.
Quassnoi

81

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


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

40

Solo porque es un poco 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 tabla en lugar de una columna), de lo contrario no creo que sea muy diferente. Creo que en cuanto al rendimiento deberían ser equivalentes.


1
Será mejor que pongas UNION ALL aquí.
Quassnoi 03 de

¿Qué diferencia podría agregar "TODOS" con tres consultas de una sola fila? Los resultados deben ser los mismos de cualquier manera, ¿no?
Mike Woodhouse

1
UNIÓN sin TODOS los resultados de los grupos. Si hay 2 filas en la tabla_1 y la tabla_2, y 3 filas en la tabla_3, obtendrá dos filas en su conjunto de resultados, y no podrá saber a partir del conjunto de resultados cuántas filas tiene la tabla_2: 2 o 3.
Quassnoi

44
Sí, pero selecciono el nombre de la tabla, lo que hace que los resultados sean únicos. De lo contrario, estaría en lo correcto, pero ¿qué valor habría en varios números sin contexto? ;-)
Mike Woodhouse

Esta también es una buena manera de usar una instrucción CTE (WITH SELECT) para cada recuento.
blue_chip

28

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 obtengo el resultado que buscas.


11

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
/

7

Como no puedo ver ninguna otra respuesta, mencione esto.

Si no le gustan las subconsultas y tiene claves principales en cada tabla, puede hacer esto:

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

Pero en cuanto al rendimiento, creo que la solución de Quassnoi es mejor y la que usaría.


7

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


7

Aquí es de mi parte para compartir

Opción 1: contar desde el mismo dominio desde una tabla diferente

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

Opción 2: contar desde diferentes dominios para la misma tabla

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

Opción 3: contar desde diferentes dominios para la misma tabla con "union all" para tener filas de conteo

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

Disfruta el SQL, siempre lo hago :)


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

Se le ocurrió una puñalada rápida:

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

Nota: Probé esto en SQL Server, por From Duallo que no es necesario (de ahí la discrepancia).


5

Para completar, 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 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 puede ejecutar para obtener sus cuentas. Es solo un guión útil para tener a veces.


4

Si las tablas (o al menos una columna clave) son del mismo tipo, 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 satisfacción y ponga otra suma () a su alrededor.

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

o

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

0

ÚNETE con diferentes mesas

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

0

select (select count ( ) from tab1 donde fieldlike 'value') + (select count ( ) from tab2 donde fieldlike 'value') count


-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

Bienvenido a StackOverflow y gracias por publicar. Por favor, eche un vistazo a Cómo responder .
Serge Belov

Esta respuesta es incorrecta. No se puede usar union (debe usar union all).
Deadsheep39
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.