我想在同一个查询中显示两个表的结果,这些表是相同的,但是一个存储历史信息,另一个有今天的信息(在线),我的表看起来像这样。
历史表:TBL1
T_ID Resolve Date
---------- ------------ ------------
AD_1234 GOOD 12/18/16
VF_4569 BAD 12/19/16
RT_5436 GOOD 12/17/16
在线表:TBL2
T_ID Resolve Date
---------- ------------ ------------
AR_2334 BAD 12/20/16
FT_1362 BAD 12/20/16
GH_5676 GOOD 12/20/16
预期成果:TBL3
T_ID Resolve Date
---------- ------------ ------------
AD_1234 GOOD 12/18/16
VF_4569 BAD 12/19/16
RT_5436 GOOD 12/17/16
AR_2334 BAD 12/20/16
FT_1362 BAD 12/20/16
GH_5676 GOOD 12/20/16
无法通过查询创建新的表,视图或任何类型的对象。
我继续获取重复记录,我知道我在这两个表上都没有相同的数据。
select o.transaction_id, o.ts_0002
from data_headers1 o
where
virtual_table_id = '5237260000000002621'
union all
select h.transaction_id, h.ts_0002
from data_headers1_hist h
where virtual_table_id = '5237260000000002621'
and TO_CHAR(h.ts_0002, 'YYYY/MM/DD HH24:MI:SS') >= '2016/12/01 00:00:00'
and TO_CHAR(h.ts_0002, 'YYYY/MM/DD HH24:MI:SS') <= '2016/12/30 23:59:59';
答案 0 :(得分:0)
与此同时:
您必须知道数据的来源(TBL1 / TBL2)
select 1 as tab,T_ID,Resolve,"Date" from TBL1 t
union all select 2 ,T_ID,Resolve,"Date" from TBL2 t
P.S。
更改h.ts_0002的条件
1.如果h.ts_0002上有分区/索引,则表示您无法使用它们
2.将所有行的h.ts_0002转换为char是浪费资源。
h.ts_0002 >= timestamp '2016-12-01 00:00:00'
and h.ts_0002 < timestamp '2017-01-01 00:00:00'
P.S。 2
select transaction_id
,count(*) as total
,count(case tab when 1 then 1 end) as tab1
,count(case tab when 2 then 1 end) as tab2
from (select 1 as tab
,o.transaction_id
from data_headers1 o
where virtual_table_id = '5237260000000002621'
union all
select 2
,h.transaction_id
from data_headers1_hist h
where virtual_table_id = '5237260000000002621'
and h.ts_0002 >= timestamp '2016-12-01 00:00:00'
and h.ts_0002 < timestamp '2017-01-01 00:00:00'
)
group by transaction_id
having count(*) > 1
order by transaction_id
;
答案 1 :(得分:0)
SQL是一种声明性语言,只是意味着你想要一些数据的联合,只需使用术语UNION(SQL Server示例):
SELECT T_ID, Resolve, Date From Tbl1
UNION
SELECT T_ID, Resolve, Date From Tbl2
*查询未经过测试。
注意:如果您需要显示重复的结果,可以用UNION ALL替换UNION。