2016-05-03 58 views
1

我有類似下面的查詢(簡化了查詢 - 我的查詢要複雜得多),其中在「選擇」所有列都是相同的。唯一的區別是我已經在6個不同的模式上運行查詢。我目前使用聯合來檢索數據 - 但是查詢看起來很大並且不可讀。有沒有更優雅的方法可以使用?查詢的Oracle SQL查詢簡化一個涉及多個模式

select name , employeeid , date from STRDB1.employee where........... 
UNION 
select name , employeeid , date from STRDB2.employee where........... 
UNION 
select name , employeeid , date from STRDB3.employee where........... 
UNION 
select name , employeeid , date from STRDB4.employee where........... 
+0

你可以用'VIEW'包裹再用'SELECT * FROM my_view'。 .. – lad2025

+0

我沒有權限在此prod db中創建視圖... –

+1

不幸的是,沒有通用的'FROM * .employee'。它在'SELECT *(EXCEPT foo,bar)'旁邊的願望清單中。也就是說,@ lad2025的CTE示例可能與您所能達到的「優雅」接近。 –

回答

2

你可以使用common table expression /子查詢一次結合,做業務的其餘部分主查詢:

WITH cte_name AS 
(
    select name , employeeid , date from STRDB1.employee where........... 
    UNION 
    select name , employeeid , date from STRDB2.employee where........... 
    UNION 
    select name , employeeid , date from STRDB3.employee where........... 
    UNION 
    select name , employeeid , date from STRDB4.employee where........... 
) 
SELECT * 
FROM cte_name 
WHERE ... 
GROUP BY ... 
ORDER BY ... 
+0

Thanks Lad,但我認爲沒有辦法針對不同的模式重複相同的查詢。 –

1

您可以嘗試全外連接:

通常情況下,外連接從表A到表B將返回表A中的每個記錄,並且如果它在表B中有配對,那麼也將返回。將輸出表A中的每一行,但表B的某些行可能不會出現在結果集中。一個完整的外部聯接將返回表A EBERY一行,以及每一行表B.

例:

Select nvl(T1.name, T2.name, T3.Name...), 
nvl(T1.employeeid , T2.employeeid , T3.employeeid ...) ,... 
from STRDB1.employee T1 
full outer join STRDB2.employee T2 
on T1.key=T2.key 
full outer join STRDB3.employee T3 
on T2.key=T3.key 
.... 
+1

你能舉一個例子說明如何幫助OP解決他們的問題嗎?他們正在努力與UNIONs,而不是JOINs。 –

+0

@Llama先生我明白OP並沒有在Union身上掙扎,他已經有了UNION的解決方案並且正在尋找替代品。 –

+0

感謝Haytem,是否可以幫助修改我的示例查詢? –