2016-05-30 59 views
1

我有兩條select語句,其中有兩個common或者兩個不常見的表 我正在使用這兩條語句的聯合,但我怎樣才能在 中使用常見表,時間在兩條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

這兩個表在兩個select語句中都使用了兩次。 有沒有什麼辦法讓我可以使用他們,如果我們的目標是剛纔提到他們曾經那麼只有一次

+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

爲什麼'聯盟所有'?誰說數據是獨一無二的? – sagi

+0

@sagi必須是存在於某處的ArchiveDateTime或EditDateTime,這意味着行將是唯一的。所以UNION ALL可以提高效率,因爲它不會試圖去重複結果。 – JBrooks

+0

我知道'UNION ALL'的功能,但你怎麼能決定'必須有一個ArchieveDateTime'? – sagi

0

試試這個,如果來自兩個表的ID可以具有相同的值(例如自動生成的整數),這將工作。

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