SQL联盟用于多个表

时间:2016-12-20 23:28:51

标签: sql oracle11g

我想在同一个查询中显示两个表的结果,这些表是相同的,但是一个存储历史信息,另一个有今天的信息(在线),我的表看起来像这样。

历史表: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';

2 个答案:

答案 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。