Виберіть кількість (*) з декількох таблиць


229

Як я можу вибрати 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

Відповіді:


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

14
для чого вам потрібен подвійний? що це означає?
Рей Лу

31
Це підроблена таблиця з одним записом. Ви не можете мати SELECT без FROM в Oracle.
Quassnoi

3
dual - це таблиця в DB Oracle, до якої можуть отримати доступ усі акаунти, ви можете використовувати її для загальних потреб, таких як: "SELECT sysdate FROM dual"
dincerm

5
Це не має ніякої різниці, Oracle нічого не буде оцінювати всередині COUNT (*).
Quassnoi

4
@ Stéphane: це відбувається, коли ви спробуєте код Oracle на PostgreSQL. Втратити FROM dual.
Quassnoi

81

В якості додаткової інформації, щоб виконати те саме в SQL Server, вам просто потрібно видалити частину запиту "ВІД подвійної".


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

Яку різницю може додати "ВСЕ" за допомогою трьох однорядних запитів? У будь-якому випадку результати повинні бути однаковими?
Майк Вудхаус

1
UNION без ВСІХ результатів групи. Якщо в таблиці_1 і таблиці_2 є 3 ряди, а в таблиці_3 - 3 рядки, ви отримаєте два ряди у своєму наборі результатів, і ви не зможете сказати з набору результатів, скільки рядків має таблиця_2: 2 або 3.
Квасной

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

Ось від мене поділитися

Варіант 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, я завжди роблю :)




6

Швидкий удар вдався до:

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

Примітка. Я перевірив це на SQL Server, тому From Dualце не потрібно (звідси розбіжність).


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   );

0

виберіть (виберіть кількість ( ) з табл1, де fieldяк "значення") + (виберіть кількість ( ) з табл2, де fieldяк "значення")


-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

Ласкаво просимо до StackOverflow та дякуємо за публікацію. Будь ласка, подивіться, як відповісти .
Серж Белов

Ця відповідь неправильна. Неможливо використовувати об'єднання (слід використовувати об'єднання всіх).
Deadsheep39
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.