2015-08-12 2 views
2

У меня есть 4 разных вида, которые будут предоставлять данные в том же формате. Мое требование - написать один запрос, который объединит данные из всех этих четырех представлений с данными из другой таблицы «Таблица 1» таким образом, что если эти данные в «Таблице 1» уже присутствуют в любом из четырех представлений (с использованием некоторого id) то я не должен добавлять его в конечный результат.Объединение данных из разных представлений в одно заявление sql

Для например: View1, View2, View3, View4, Table1

Мой конечный результат должен быть

(View1 + View2 + View3 + View4 + (Table1- (View1 + View2 + 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) 

Есть ли какие-либо лучшие способы создания этого запроса, который улучшит производительность, особенно когда есть огромные данные.

+1

По крайней мере, заменить 'union's в' не в' подзапроса с 'профсоюзного all's - вы не забота об уникальности там. – Mureinik

ответ

0

Вы пробовали использовать разные? :

select distinct(*) from (
select * from view1 union 
select * from view2 union 
select * from view3 union 
select * from view4 union 
select * from Table1); 
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 является основным атрибутом, который сообщает вам, следует ли извлекать запись из таблицы1, тогда вы можете подойти к проблеме, как это было предложено в ответ. Если целая запись содержит отличительные данные, вы можете объединить все запросы с оператором union. В этом случае =>

select * 
from v_basic 
union 
select * 
from table1 

... должно быть достаточно

Смежные вопросы