我有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)
是否有更好的方法来构建此查询,这将提高性能,尤其是在存在大量数据时
答案 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
......应该够了