2016-05-30 2 views
1

У меня есть два оператора выборки с двумя общими или двумя необычными таблицами , и я беру объединение этих двух операторов, но как я могу использовать общие таблицы в оба оператора только один времяИспользовать общие таблицы в двух операциях select только один раз

select * from (select * 
from table1 t1 
join table2 t2 
on t2.id = t1.id_fk 
join table3 t3 
on t3.id=t2.id_fk 
join table4 t4 
on t4.id=t3.id_fk 
union 
select * 
from table1_arc t1 
join table2_arc t2 
on t2.id = t1.id_fk 
join table3 t3 
on t3.id=t2.id_fk 
join table4 t4 
on t4.id=t3.id_fk) 
order by 1 

Теперь посмотрим

таблица 3 и таблица 4

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

+0

Спасибо всем. Он работает – DevUzair

ответ

0

Попробуйте

SELECT * 
FROM (
    SELECT * 
    FROM table1 t1 
    JOIN table2 t2 
     ON t2.id = t1.id_fk 
    union 
    SELECT * 
    FROM table1_arc t1 
    JOIN table2_arc t2 
     ON t2.id = t1.id_fk 
) A 
JOIN table3 t3 
    ON t3.id = A.id_fk 
JOIN table4 t4 
    ON t4.id = t3.id_fk 
ORDER BY 1 
0

Если цель состоит в том, чтобы просто ссылаться на них один раз, то это будет:

select * 
from (select * 
    from table1 t1 
    join table2 t2 
    on t2.id = t1.id_fk 
    union all 
    select * 
    from table1_arc t1 
    join table2_arc t2 
    on t2.id = t1.id_fk) as Main 
join table3 t3 
on t3.id=Main.id_fk 
join table4 t4 
on t4.id=t3.id_fk 
+0

Почему 'UNION ALL'? Кто сказал, что данные уникальны? – sagi

+0

@sagi Должен быть ArchiveDateTime или EditDateTime там где-то, что означает, что строки будут уникальными. Таким образом, UNION ALL делает его более эффективным, поскольку он не пытается дедуктировать результаты. – JBrooks

+0

Я знаю, что делает «UNION ALL», но как вы можете решить, «должен быть ArchieveDateTime»? – sagi

0

Попробуйте это, это будет работать, если идентификаторы из двух таблиц могут иметь одинаковые значения, такие как автоматически генерируемые целые числа.

select * 
    from (
    select *, 
      T2.ID QueryFk1, 1 QueryKey, 
     from table1 t1 
     join table2 t2 
      on t2.id = t1.id_fk 
    union 
    select *, 
      T2.ID QueryFk2, 2 QueryKey, 
    from table1_arc t1 
    join table2_arc t2 
     on t2.id = t1.id_fk 
) A 
    join table3 t3 
    on (t3.id=A.QueryFk1 And A.QueryKey = 1) Or 
     (t3.id=A.QueryFk2 And A.QueryKey = 2) 
    join table4 t4 
    on t4.id=t3.id_fk 
    order by 1 
Смежные вопросы