使用单个查询从多个表中统计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