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
usuario73118
fuente

Respuestas:

328
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
fuente
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.

dincerm
fuente
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.

Mike Woodhouse
fuente
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.

Nic Wise
fuente
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
/
David Aldridge
fuente
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.

Jimmy Stenke
fuente
7

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

casperOne
fuente
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 :)

Fadzil
fuente
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
fuente
6
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
Jens Schauder
fuente
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).

CJM
fuente
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.

Chris Gill
fuente
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
)

fuente
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
Sheikh Kawser
fuente
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)
Rabby Hasan
fuente
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   );
zloctb
fuente
0

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

Cris
fuente
-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
fuente
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