使用单个查询从多个表中统计sql记录
我有一个表格列表,例如:使用单个查询从多个表中统计sql记录,sql,oracle,Sql,Oracle,我有一个表格列表,例如: mytableA mytableB mytableC 这些表都有相同的列(时间戳) 我可以分别对每个表进行计数: select count(*) from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'; select count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000';
mytableA
mytableB
mytableC
这些表都有相同的列(时间戳)
我可以分别对每个表进行计数:
select count(*) from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000';
select count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000';
select count(*) from mytableC where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000';
如何将其组合到一个查询中?有简单的方法吗
预期成果:
MyTableName MyCnt
----------- -----
mytableA 121
mytableB 78
mytableC 2345
我不确定Oracle,在SQLserver中,您可以这样做
select (select count(*) from table1) + (select count(*) from table2)
更新:
或者像这样,
select (select count(*) from table1) ,(select count(*) from table2)
或者
这个怎么样
SELECT
a, b, c
FROM
(select count(*) from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') AS a,
(select count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') AS b,
(select count(*) from mytableC where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') AS c
不知道这是否有效:/试试这个
select 'myTableA' MyTableName, count(*) MyCnt from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'
union all
select 'myTableB', count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'
union all
select 'myTableC', count(*) from mytableC where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000';
select 'mytableA' as tablename, count(*) from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'
union all
select 'mytableB' as tablename , count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'
union all
select'mytableB' as tablename , count(*) from mytableC where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'
您不能直接使用
where table in(myTableA、myTableB等)这样的查询来执行此操作。
但您可以对联合所有解决方案进行预处理:
select MyTableName, count(*)
FROM(
select 'myTableA' MyTableName, timestamp from mytableA
union all
select 'myTableB', timestamp from mytableB
union all
select 'myTableA', timestamp from mytableC
)
WHERE timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000'
GROUP BY MyTableName;
使用Oracle 11gR2:
select
(select count(*) from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') tabA,
(select count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') tabB,
(select count(*) from mytableC where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') tabC
from dual;
结果:
tabA| tabB| tabC
----|-----|-----
121| 78| 2345
谢谢这个漂亮多了。我确实需要按MyTableName添加组
,以使其正常工作。谢谢。那个简单优雅的解决方案胜过一切。请不要盲目回答
select
(select count(*) from mytableA where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') tabA,
(select count(*) from mytableB where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') tabB,
(select count(*) from mytableC where timestamp = to_char(sysdate-1, 'yyyymmdd') || '0000') tabC
from dual;
tabA| tabB| tabC
----|-----|-----
121| 78| 2345