2017-01-28 18 views
-1

以下の3つの表を検討してください。Oracle SQLの条件付き結合

Col a Col b Col c 
1 000 Actual data 
1 001 Actual data 
2 000 Actual data 
3 000 Actual data 
3 001 Actual data 
3 002 Actual data 

表B

Col a Col b Col d 
1 000 Actual data 
1 001 Actual data 
2 000 Actual data 

Table c 
Col a Col b Col d 
3 000 Actual data 
3 001 Actual data 
3 002 Actual data 

表Aは、親テーブルとテーブルBとCは、子テーブル3間で共通& B COL有する接合する必要があるです。 コーラCOLのB COL CはCOLのD 1 000 someDataがのMOREDATA 1 001 someDataがのMOREDATA:

さてのみが

が所望表Cで検索されるべきであるBデータがテーブルに見つからない場合ようにすべきである参加 2 000 someDataがMOREDATA 3 000 someDataがMOREDATA 3 001 someDataがMOREDATA 3 002 someDataがMOREDATA

さて、私は、にし、C bは左結合されてやっているが、私は、レコードごとに時間を考えて、現在どのようなbとcで検索されますコスト効率が悪くなります。したがって、レコードがbに存在しない場合には、検索のみが行われるように、コスト効果的/微調整を行いたいと考えています。

+0

編集ご質問や、サンプルデータと望ましい結果を提供します。 –

+0

データはconfiedential kindof stuffですが、私は質問でシュレッドしました –

+1

@Somesh - 希望の結果を追加してください – GurV

答えて

0

まず、BとCの2つのテーブルBとCの結合を作成しますが、Bの場合はCのものを無視し、テーブルAとの結合を行う必要があります。このように:今、このテーブルを使用して

SELECT B.cola, B.colb from B 
UNION ALL 
SELECT C.cola, C.colb from C 

には、表と同じように参加することができます:あなたが本当に必要なもの

SELECT A.cola, A.colb, tmp.colc 
FROM A 
JOIN 
(SELECT B.cola, B.colb, B.colc from B 
UNION ALL 
SELECT C.cola, C.colb from C) AS tmp 
ON A.cola = tmp.cola 
AND A.colb = tmp.colb 
+0

UNION ALLは、あなたがINTERSECTを使ってUNIONによって何をしているか、それは何も繰り返されないUNIONであることをします。 – Edward

+0

ありがとう、私の答えを修正しました! –

+0

テーブルBが空の場合にのみ、テーブルC **の行に結合する必要があります。これ(またはあなたが投稿した最初のバージョン)はそれをどのように達成するのですか? – mathguy

1

は、テーブルBからすべての行を「収集」する方法であり、場合テーブルCのすべての行が存在しない場合、Aへの結合は標準です。

何かこれはうまくいくはずです。それをサブクエリーにして、最初のテーブルに結合します。

select col_a, col_b, col_c 
    from table_b 
union all 
select col_a, col_b, col_c 
    from table_c 
    where (select count(*) from table_b) = 0 

table_bは、少なくとも一つの列を持っている場合(where条件はtable_c内のすべての行に対して偽になるので)、何もtable_cから選択されません。ただし、table_bが空の場合は、table_cのすべての行が選択されます。

0

左側の2つが結合します

select a.*, b.*, c.* 
from a 
left join b 
on a.cola=b.cola 
and a.colb = b.colb 
left join c 
on a.cola=c.cola 
and a.colb=c.colb 
+0

私はそれがaのすべてのcをチェックすると思います。 –

+0

@SomeshPursnani結合順序は依存します。見つけ出すには、実行計画を立てる – BobC