2016-05-04 6 views
2

3つのテーブルの条件付き結合を行いたいとします。左は、テーブルBに参加し、キーが欠落している場合、次にBで2及び4に該当するキー、およびC. 期待される結果で5用がないキーはありませんC.複数のテーブルへのSQL条件付き結合をワンショットで行う

+------+--+------+-------------+--+------+-------------+ 
| A.id | | B.id | B.OtherFish | | C.id | C.OtherFish | 
+------+--+------+-------------+--+------+-------------+ 
| 1 | | 1 | B1   | | 1 | C1   | 
| 2 | |  |    | | 2 | C2   | 
| 3 | | 3 | B3   | | 3 | C3   | 
| 4 | |  |    | | 4 | C4   | 
| 5 | | 5 | B5   | |  |    | 
| 6 | | 6 | B6   | | 6 | C6   | 
+------+--+------+-------------+--+------+-------------+ 

テーブルへの結合:

は、
+------+-----------+ 
| A.id | OtherFish | 
+------+-----------+ 
| 1 | B1  | 
| 2 | C2  | 
| 3 | B3  | 
| 4 | C4  | 
| 5 | B5  | 
| 6 | B6  | 
+------+-----------+ 

私が使用するクエリは、次のとおりです。

select 
A.id 
,coalesce(B.id,C.id) 
,coalesce(B.OtherFish,C.OtherFish) 
from A 
left join B 
on A.id=B.id 
left join C 
on A.id=C.id 

アプローチの欠点は、私は別のテーブルから必要なすべての列を通じて合体使用しなければならないということです。テーブルに100個の列があると迷惑です。 のように、全体のエイリアスを融合させることが望ましいでしょう。coalesce(B,C)です。 C.idに私はすべてのカラムを通じて合体することなく、すべての良いデータを持っているなるように

left join B 
on A.id=B.id 
left join C 
on A.id=(case when B.id is null then C.id end) 

は次のように一発でそれを作るために、それは可能ですか?

+0

は、いくつかのサンプル・テーブル・データと予想される結果を追加します。 – jarlh

+0

あなたはどのRDBMSを使用していますか? –

+1

COALESCEの何が問題なのですか? –

答えて

2

私はCOALESCEと間違って何も表示されませんが、あなたはUNIONを使用して試すことができ、このような何か:

SELECT a.id,t.OtherFish 
FROM A 
LEFT JOIN(SELECT b.id,b.otherFish FROM b 
      UNION ALL 
      SELECT c.id,c.otherFish FROM C 
      where c.id NOT EXISTS(SELECT 1 FROM b bb WHERE bb.id = c.id)) t 
ON(a.id = t.id) 
+0

@GordonLinoffええと、なぜか分からない。 – sagi

+0

このアプローチに感謝します。それにもかかわらず、より簡単な解決策が提示されていないことは残念です。数学と比較して、私が望むのは、数百もの列を合体させないために、エイリアスをカッコの外側に置くことです。 –

+0

申し訳ありませんが、他の解決方法はありません。一般的に、この問題を解決するには合体が適切ですが、このクエリは少し速いかもしれません。私はこれを解決する他の方法について聞いたことがない。これは数学ではない。 @PrzemyslawRemin – sagi