Выберите количество (*) из нескольких таблиц

230

Как я могу выбрать 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
user73118
источник

Ответы:

328
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
источник
14
зачем тебе двойной? что это значит?
Рэй Лу
31
Это фальшивая таблица с одной записью. Вы не можете иметь SELECT без ОТ в Oracle.
Quassnoi
3
dual - это таблица в базе данных oracle, к которой все учетные записи могут получить доступ. Вы можете использовать ее для общих нужд, таких как: «SELECT sysdate FROM dual»
dincerm
5
Это не имеет значения, Oracle не будет ничего оценивать внутри COUNT (*).
Quassnoi
4
@ Stéphane: это происходит, когда вы пробуете код Oracle на PostgreSQL. Потерять FROM dual.
Quassnoi
81

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

dincerm
источник
1
Я только собирался сказать: «А как же MS SQL, когда я увидел твой комментарий. Спасибо, что предвидел необходимость!»
Эндрю Нили,
40

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

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

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

Майк Вудхаус
источник
1
Тебе лучше поставить UNION ALL здесь.
Quassnoi
Какая разница может быть при добавлении «ALL» с тремя однорядными запросами? В любом случае, результаты должны быть одинаковыми?
Майк Вудхаус
1
СОЮЗ без ВСЕХ групп результатов. Если в table_1 и table_2 есть 2 строки и 3 таблицы в table_3, вы получите две строки в вашем наборе результатов и не сможете определить из набора результатов, сколько строк в table_2 имеет: 2 или 3.
Quassnoi
4
Да, но я выбираю имя таблицы, что делает результаты уникальными. В противном случае вы были бы правы, но какое значение было бы в нескольких числах без контекста? ;-)
Майк Вудхаус,
Это также хороший способ использовать оператор CTE (WITH SELECT) для каждого счетчика.
blue_chip
28

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

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

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

Ник Мудрый
источник
11

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

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

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

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

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

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

Джимми Стенке
источник
7

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

casperOne
источник
7

Вот от меня поделиться

Вариант 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, я всегда делаю :)

Fadzil
источник
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

Быстрый удар пришелся с:

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

Примечание: я проверил это в SQL Server, поэтому From Dualне является необходимым (отсюда и расхождение).

CJM
источник
5

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

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

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

Крис Гилл
источник
4

Если таблицы (или, по крайней мере, ключевой столбец) одного типа, сначала создайте объединение, а затем подсчитайте.

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

Или возьмите свой напиток и положите вокруг него еще одну сумму ().

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

или

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)
Рабби Хасан
источник
0

ПРИСОЕДИНЯЙТЕСЬ к разным таблицам

SELECT COUNT(*) FROM (  
SELECT DISTINCT table_a.ID  FROM table_a JOIN table_c ON table_a.ID  = table_c.ID   );
zloctb
источник
0

выберите (выберите count ( ) из tab1, где, fieldкак «значение») + (выберите count ( ) из tab2, где, fieldкак «значение») count

Cris
источник
-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
источник
Добро пожаловать в StackOverflow и спасибо за публикацию. Пожалуйста, посмотрите как ответить .
Сергей Белов
Этот ответ неверен. Невозможно использовать union (следует использовать union all).
Deadsheep39