2017-05-01 4 views
0

以下のクエリで問題があります。ステップの列を結合します。 例えばa.code最初にb.name1が一致しない場合は、name2などを結合します。ただし、クエリを処理できません。oracleで段階的に注文を結合する

SELECT * FROM TABLE A 
LEFT JOIN TABLE B 
ON A.CODE = B.NAME1 
OR A.CODE = B.NAME2 
OR UPPER(B.NAME3) = UPPER(A.NAME) 

おかげ

編集 以下のサンプル、 とTABLEB.CODE = TABLEA.NAME1が一致した場合、その後に見えるOR TABLEB.CODE = TABLEA.NAME2したくありません。 そして、TABLEB.CODE = TABLEA.NAME1と一致しない場合、その順序で列を段階的に一致させます。

WITH TABLEA AS (SELECT 13445 AS ID,'A' AS TYPE,'DFSF' AS NAME1 , 'PCK' AS NAME2 FROM DUAL 
       UNION ALL 
       SELECT 13445 AS ID,'A' AS TYPE,'PCK' AS NAME1 , 'PCK' AS NAME2 FROM DUAL), 

     TABLEB AS (SELECT 56544 AS ID, 'PCK' AS CODE,  'PCK' AS FRST_NM FROM DUAL) 
SELECT * FROM TABLEA 
LEFT JOIN TABLEB 
ON TABLEB.CODE = TABLEA.NAME1 
OR TABLEB.CODE = TABLEA.NAME2 
OR UPPER(TABLEB.FRST_NM) = UPPER(TABLEA.NAME2) 
+2

与えるサンプルデータと予想される出力 – Utsav

+0

あなたは自分でテーブルに参加しますか? –

+0

どの条件が一致しても問題にならないのはなぜですか?結果には影響しません。それとも、テーブルBのコードでは、テーブルAのコードと一致する「最良の」ものだけを探したいのですか?より多くのデータと期待される結果は依然として有効です。 –

答えて

0

私はあなたの質問があなたの望むことをすると信じています。既にORと記載されている場合、参加条件にはstep by stepはありません。したがって、どちらかの条件が一致すると、行が一致します。したがって、ではなくA.CODE = B.NAME2の場合は一致します。両方が真であれば、それらも一致します。私はサンプルデータを使ってCTEを作成し、出力を確認します。それは3つのマッチの3行を返します。

WITH TBL(SEQ,CODE,NAME,NAME1,NAME2,NAME3) AS 
    (
     SELECT 1,'A1','B','A1','D','E' FROM DUAL UNION ALL -- as A.CODE(A1)=B.NAME1, it will match 
     SELECT 2, 'B2','B','D','B2','F' FROM DUAL UNION ALL --as A.CODE (B2) <> B.NAME1 , it will match for B.NAME2 
     SELECT 3, 'G','H1','D','A','H1' FROM DUAL UNION ALL --match for UPPER(B.NAME3) = UPPER(A.NAME) 
     SELECT 4,'P4','Q4','R4','S4','T4' FROM DUAL 
    ) 
    SELECT * FROM TBL A 
    LEFT JOIN TBL B 
    ON (A.CODE = B.NAME1 
     OR A.CODE = B.NAME2 
     OR UPPER(B.NAME3) = UPPER(A.NAME) 
     ) 

列SEQは、どの行が戻ってくるかを見るためのものです。

出力

+-----+------+------+-------+-------+-------+-------+--------+--------+---------+---------+---------+ 
| SEQ | CODE | NAME | NAME1 | NAME2 | NAME3 | SEQ_1 | CODE_1 | NAME_1 | NAME1_1 | NAME2_1 | NAME3_1 | 
+-----+------+------+-------+-------+-------+-------+--------+--------+---------+---------+---------+ 
| 1 | A1 | B | A1 | D  | E  |  1 | A1  | B  | A1  | D  | E  | 
| 2 | B2 | B | D  | B2 | F  |  2 | B2  | B  | D  | B2  | F  | 
| 3 | G | H1 | D  | A  | H1 |  3 | G  | H1  | D  | A  | H1  | 
| 4 | P4 | Q4 | R4 | S4 | T4 |  |  |  |   |   |   | 
+-----+------+------+-------+-------+-------+-------+--------+--------+---------+---------+---------+ 
+0

あなたの予想される出力は、クエリから返された2行だけですか? – Utsav

+0

親愛なるUtsav、私は1つの行を期待しました。TABLEB.CODE = TABLEA.NAME1のように一致したら、他の結合列を探す必要はありません – usernotfound

+0

LEFT JOIN TABLEB ON TABLEB.CODE = TABLEA.NAME1 --first_match OR TABLEB.CODE = TABLEA.NAME2 - 最初の一致が失敗した場合 またはUPPER(TABLEB.FRST_NM)= UPPER(TABLEA.NAME2) - 2番目の一致が失敗した場合 – usernotfound

関連する問題