将来自不同视图的数据合并到单个sql语句中

时间:2015-08-12 07:19:04

标签: oracle

我有4个不同的视图,它将以相同的格式提供数据。我的要求是编写一个查询,它将来自所有这四个视图的数据与来自另一个表'Table1'的数据组合在一起,如果'Table1'中的数据已存在于四个视图中的任何一个中(使用一些id)那么我不应该把它添加到最终结果。

例如:View1,View2,View3,View4,Table1

我的最终结果应该是

  

(视图1 +视图2 + VIEW3 + View4 +(Table1-(视图1 +视图2 + VIEW3 + View4))

所以我写的查询就像下面的一样

selet * from view1 union 
select * from view2 union 
select * from view3 union 
select * from view4 union 
select * from Table1 where Table1.Id Not in 
(select Id from view1 union 
select Id from view2 union 
select Id from view3 union 
select Id from view4 union)

是否有更好的方法来构建此查询,这将提高性能,尤其是在存在大量数据时

2 个答案:

答案 0 :(得分:0)

你尝试过使用distinct吗? :

select distinct(*) from (
select * from view1 union 
select * from view2 union 
select * from view3 union 
select * from view4 union 
select * from Table1);

答案 1 :(得分:0)

实际上not in可以实现为minus。在逻辑层面上,您可以实现以下目标:

-- step 1
create or replace view v_basic
as
select *
from view1
union
select *
from view2
union
select *
from view3
union
select *
from view4;

-- step 2
create or replace view v_extension
as 
select id
from table1
minus
select id
from v_basic

-- step 3
select *
from v_basic
union
(select *
 from table1 t1
 where exists (select *
               from v_extension e1
               where e1.id = t1.id)

由于联盟运营商明显会得到一个完整的记录,也许你不必打扰一个id是否出现两次。因此,如果id属性是主要属性,它告诉您是否应该从table1中检索记录,那么您可以按照回答中的建议来解决问题。如果整个记录包含特殊数据,那么您可以将所有查询与union运算符合并。在那种情况下=>

select *
from v_basic
union
select *
from table1

......应该够了