2017-12-07 24 views
0
table A 
    ---------------------------- 
    NAME | CODE | BRANCH 
    ---------------------------- 
    bob | PL | B 
    david | AA | B 
    susan | PL | C 
    joe | AB | C 
    alfred | PL | B 

table B 
    ---------------------------- 
    CODE | DESCRIPTION 
    ---------------------------- 
    PL | code 1 
    PB | code 2 
    PC | code 3 

table C 
    ---------------------------- 
    CODE | DESCRIPTION 
    ---------------------------- 
    AA | code 4 
    AB | code 5 
    AC | code 6 

テーブルA、B、Cを結合する方法はありますか?条件付き左結合SQL

select A.*, COALESCE(B.DESCRIPTION, C.DESCRIPTION) AS DESCRIPTION from A 
left join B on A.CODE = B.CODE 
left join C on A.CODE = C.CODE 

私の実際のケースでは、同じ列に参加するには10以上があります。 だから私は条件付き左を必要とするが、あなたはフロー制御を実装するためにCASEを使用することはできません。この

SELECT A* , DESCRIPTION 
FROM A LEFT JOIN (
    CASE 
     WHEN A.CODE = 'B' THEN SELECT * FROM B 
     WHEN A.CODE = 'C' THEN SELECT * FROM C 
     END 
    ) BC ON A.CODE = BC.CODE 
+0

それは、ON句で代わりにcase式のAND/OR構造を使用する方が良いでしょう。 – jarlh

+0

私は動的SQLはあなたがこの場合に欲しいと思う。これはあなたがそれを始めるのに役立ちます:https://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/ –

+0

私はsqlfiddleを通して私に例を与えてもらえますか? – muhnizar

答えて

1

のようなものに参加します。 SQLのCASEは、単一の値を返す式です。

かわりに、次のクエリを使用することができます。

select A.*, 
     CASE A.BRANCH 
      WHEN 'B' THEN B.DESCRIPTION 
      WHEN 'C' THEN C.DESCRIPTION 
     END AS DESCRIPTION 
from A 
left join B on A.CODE = B.CODE AND A.BRANCH = 'B' 
left join C on A.CODE = C.CODE AND A.BRANCH = 'C' 
+0

私の質問と同じように、私はすべてのテーブルに参加したくありません。テーブルAのカラムブランチに基づいて必要なテーブルに結合する。 – muhnizar

+0

従って1テーブルのみを結合する – muhnizar

+0

@muhnizarこれは不可能だと恐れている –

0

あなたはクエリを生成するためにこれを使用することができます。次に、PL/SQLブロックを作成してこれらのすべての問合せをループし、動的に実行して別々の結果を得ます。

SELECT 'SELECT A.* , DESCRIPTION 
FROM TABLEA A LEFT JOIN ' 
     || CASE WHEN A.BRANCH = 'B' THEN 'TABLEB B' END 
     || CASE WHEN A.BRANCH = 'C' THEN 'TABLEC C' END 
     || ' ON ' 
     || 'A.CODE = ' 
     || CASE WHEN A.BRANCH = 'B' THEN 'B.CODE' END 
     || CASE WHEN A.BRANCH = 'C' THEN 'C.CODE' END 
      v_query 
    FROM TableA A; 

出力

V_QUERY                   
-------------------------------------------------------------------------------- 
SELECT A.* , DESCRIPTION 
FROM TABLEA A LEFT JOIN TABLEB B ON A.CODE = B.CODE 



SELECT A.* , DESCRIPTION 
FROM TABLEA A LEFT JOIN TABLEB B ON A.CODE = B.CODE 



SELECT A.* , DESCRIPTION 
FROM TABLEA A LEFT JOIN TABLEC C ON A.CODE = C.CODE 



SELECT A.* , DESCRIPTION 
FROM TABLEA A LEFT JOIN TABLEC C ON A.CODE = C.CODE 



SELECT A.* , DESCRIPTION 
FROM TABLEA A LEFT JOIN TABLEB B ON A.CODE = B.CODE