2016-08-25 7 views
1

のは 少なくとも1の条件が満たされた複数のテーブルを結合

は私が販売されたアイテムをリストする必要がAREA_ID、私はITEM_ID、Organisation_ID、Salesman_IDが含まれて販売してメインテーブル「Z」を、持っているとしましょう表Aの営業員または表Bの組織、表Cの地域の営業担当者のいずれかによって作成されます。エリア、組織およびセールスマンは互いに独立しています。

私は、WHERE句で副問い合わせを使用してクエリを作成することができました:

Select Z.Item_ID From Z WHERE 
Z.Salesman_ID IN (SELECT Salesman_ID From A) OR 
Z.Organisation_ID IN (SELECT Organisation_ID From B) OR 
Z.Area_ID IN (SELECT Area_ID From C) 

しかし、性能もが問題であり、そしてIは、サブセレクトよりも高速です参加言われました。私は "OR"の結果を得る方法で結合を結合することについて私の心を包むことはできません...

Sidenote:投稿前私はSQL結合の視覚的説明を読んで答えを見つけようとしました私の質問はGoogleを介して(それは非常に一般的なキーワードに基づいて適切な答えを見つけるのは難しい、tho)。

サンプル

A  | B  | C 
S04 | O16 | A07 
S12 | O01 | A08 
S14 |  | 
S15 |  | 

Zテーブル:

I01 S09 O12 A14 
I02 S17 O20 A17 
I03 S18 O20 A12 
I04 S07 O15 A01 
I05 S14 O03 A08 
I06 S16 O18 A20 
I07 S05 O03 A12 
I08 S11 O14 A05 
I09 S15 O19 A10 
I10 S13 O07 A18 
I11 S15 O08 A03 
I12 S15 O14 A13 
I13 S08 O16 A18 
I14 S16 O19 A14 
I15 S13 O18 A10 
I16 S03 O12 A08 
I17 S11 O09 A16 
I18 S14 O17 A13 
I19 S02 O13 A11 
I20 S18 O10 A06 
I21 S10 O05 A15 
I22 S19 O20 A06 
I23 S15 O16 A20 
I24 S02 O07 A04 

期待される結果:最もパフォーマンス関連の質問と同様に

I05 
I09 
I11 
I12 
I13 
I16 
I18 
I23 
+1

ことができますサンプルデータを表示しますか?あなたの質問に「OR」が意味するものを明確にします。 –

答えて

0

、それはあなたのテーブルスキーマ、インデックスに少し依存し、データなど、それは多くの場合、existsouter joins時間がより効率化することができますT:

ザ・あなたが参照している同等joinアプローチする必要があります:

select z.item_id 
from z 
    left join a on z.salesman_id = a.salesman_id 
    left join b on z.organisation_id = b.organisation_id 
    left join c on z.area_id = c.area_id 
where a.salesman_id is not null or 
    b.organisation_id is not null or 
    c.area_id is not null 

あなたのデータに応じて、あなたもこれでdistinctを使用する必要があります。


編集:あなたのIdフィールドは、エンティティごとに一意である場合は、あなたのサンプルデータでは、その後、existsunion allを使用して、このソリューションは、おそらく(z.salesman_id, z.organisation_id, z.area_id)のインデックスと最も効率的になります。

select item_id 
from z 
where exists (
    select 1 
    from ( 
     select salesman_id id from a union all 
     select organisation_id from b union all 
     select area_id from c 
    ) t 
    where t.id in (z.salesman_id, z.organisation_id, z.area_id) 
) 
+1

悲しいことに、実際のデータベースIDフィールドはエンティティごとに一意ではありません(セールスマン1、組織1、およびエリア1のため、それぞれユニオン・アプローチは機能しません)。 –

+0

左の結合が機能します!そして私は私がこの方法でNULLを使用することができないことを理解していない、それはトリック:) –

関連する問題