SQL: объединить Select count(*) из нескольких таблиц
Как объединить несколько выборок (*) из разных таблиц в один возврат?
У меня есть такая же ситуация, как этот пост
но я хочу одно возвращение.
Я попробовал Союз все, но он выплюнул 3 отдельных ряда. Как вы объединяете их в один?
select count(*) from foo1 where ID = '00123244552000258'
union all
select count(*) from foo2 where ID = '00123244552000258'
union all
select count(*) from foo3 where ID = '00123244552000258'
редактировать: я нахожусь на MS SQL 2005
8 ответов
Решение
SELECT
(select count(*) from foo1 where ID = '00123244552000258')
+
(select count(*) from foo2 where ID = '00123244552000258')
+
(select count(*) from foo3 where ID = '00123244552000258')
Это простой способ.
Я удивлен, что никто не предложил этот вариант:
SELECT SUM(c)
FROM (
SELECT COUNT(*) AS c FROM foo1 WHERE ID = '00123244552000258'
UNION ALL
SELECT COUNT(*) FROM foo2 WHERE ID = '00123244552000258'
UNION ALL
SELECT COUNT(*) FROM foo3 WHERE ID = '00123244552000258'
);
select
(select count(*) from foo) as foo
, (select count(*) from bar) as bar
, ...
В основном вы делаете подсчеты как подзапросы в рамках стандартного выбора.
Примером может быть следующий, это возвращает 1 строку, два столбца
SELECT
(SELECT COUNT(*) FROM MyTable WHERE MyCol = 'MyValue') AS MyTableCount,
(SELECT COUNT(*) FROM YourTable WHERE MyCol = 'MyValue') AS YourTableCount,
Вы можете объединить ваши подсчеты, как вы делали раньше, но затем вы можете суммировать их все несколькими способами, один из которых показан ниже:
SELECT SUM(A)
FROM
(
SELECT 1 AS A
UNION ALL
SELECT 1 AS A
UNION ALL
SELECT 1 AS A
UNION ALL
SELECT 1 AS A
) AS B
select sum(counts) from (
select count(1) as counts from foo
union all
select count(1) as counts from bar)
Вы можете назвать все поля и добавить внешний выбор в этих полях:
SELECT A, B, C FROM ( your initial query here ) TableAlias
Это должно делать свое дело.
Для оракула:
select(
select count(*) from foo1 where ID = '00123244552000258'
+
select count(*) from foo2 where ID = '00123244552000258'
+
select count(*) from foo3 where ID = '00123244552000258'
) total from dual;