2016-05-03 8 views
1

私は以下のようなクエリを持っています(クエリの簡略化 - クエリはもっと​​複雑です)。唯一の違いは、6つの異なるスキーマでクエリを実行したことです。私は現在、データを取得するためにユニオンを使用していますが、クエリは大きく見えなくなります。もっとエレガントなアプローチがありますか?Oracle SQL Query複数のスキーマを含むクエリaの簡素化

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'でそれをラップし、my_view' FROM' SELECT *を使用することができます。完全外部結合は、例の表Bに

を表Aにebery行を返すだけでなく、すべての行です。 .. – 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

ありがとうございましたが、別のスキーマに対して同じクエリを繰り返すことはできません。 –

1

あなたは完全外部を試すことができます参加:

通常、外部結合をテーブルAからテーブルBのすべてのレコードがテーブルAの中のすべてのレコードを返し、テーブルBのメイトがあればそれも返されます。テーブルAのすべての行が出力されますが、テーブル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が問題にどのように役立つかの例を含めることができますか?彼らは、ジョインではなく、ユニオンで苦労しています。 –

+0

@ Mr.Llama私はOPがUnionと苦労していないことを理解しました。彼はすでにUNIONのソリューションを持っており、代替案を探しています。 –

+0

ありがとうHaytem、私の例のクエリを変更することは可能ですか? –

関連する問題