Выберите количество (*) из нескольких таблиц - PullRequest
195 голосов
/ 03 марта 2009

Как мне выбрать count(*) из двух разных таблиц (назовите их tab1 и tab2), в результате чего:

Count_1   Count_2
123       456

Я пробовал это:

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

Но все, что у меня есть, это:

Count_1
123
456

Ответы [ 18 ]

282 голосов
/ 03 марта 2009
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
73 голосов
/ 03 марта 2009

В качестве дополнительной информации, чтобы выполнить то же самое в SQL Server, вам просто нужно удалить часть запроса FROM dual.

30 голосов
/ 03 марта 2009

Просто потому, что это немного отличается:

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

Это дает транспонированные ответы (одна строка на таблицу вместо одного столбца), иначе я не думаю, что это сильно отличается. Я думаю, что с точки зрения производительности они должны быть эквивалентны.

23 голосов
/ 03 марта 2009

Мой опыт работы с SQL Server, но не могли бы вы сделать:

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

В SQL Server я получаю результат, который вам нужен.

8 голосов
/ 03 марта 2009

Другие немного другие методы:

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
/
6 голосов
/ 05 марта 2009

Поскольку я не вижу другого ответа, поднимите это.

Если вам не нравятся подзапросы, и имеют первичные ключи в каждой таблице, вы можете сделать это:

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

Но с точки зрения производительности я считаю, что решение Quassnoi лучше, и то, которое я бы использовал.

5 голосов
/ 09 июля 2009

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

5 голосов
/ 31 июля 2009

Вот от меня, чтобы поделиться

Вариант 1 - подсчет из одного домена из другой таблицы

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

Вариант 2 - подсчет из другого домена для одной и той же таблицы

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

Вариант 3 - подсчет из другого домена для одной и той же таблицы с «объединением всех» для количества строк

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

Наслаждайтесь SQL, я всегда делаю :)

5 голосов
/ 03 марта 2009
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
4 голосов
/ 27 августа 2009

Для полноты - этот запрос создаст запрос, чтобы подсчитать все таблицы для данного владельца.

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;

Вывод что-то вроде

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

Который вы можете затем запустить, чтобы получить ваши счета. Это просто удобный скрипт, чтобы иногда его иметь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...