2016-08-25 2 views
2

マイ(省略)コードは次のとおりです。LEFTは、DB2に登録しよう

SELECT * 

FROM 
ASSESSMENT A 
LEFT JOIN FINANCE F0 
ON F0.CLIENT = A.CLIENT 
AND F0.FIELD_CODE = 1 
AND F0.EVNT_SQNBR = 
     (SELECT MAX(FX.EVNT_SQNBR) 
     FROM 
     FINANCE FX, CROSSREF Y 
     WHERE 
      Y.CLIENT  = A.CLIENT 
     AND Y.ASMT_TCD  = A.ASMT_TCD 
     AND Y.ASMT_TY_SQNBR = A.ASMT_TY_SQNBR 
     AND FX.CLIENT_ID = A.CLIENT 
     AND FX.FIELD_CODE = F0.FIELD_CODE 
     AND FX.BUS_LN_SQNBR = F0.BUS_LN_SQNBR 
     AND FX.EVNT_SQNBR = Y.EVNT_SQNBR) 

LEFT JOIN FINANCE F1 (SAME CODE HERE EXCEPT F1.FIELD_CODE IS DIFFERENT) 
... 
LEFT JOIN FINANCE F2 (SAME CODE HERE EXCEPT F2.FIELD_CODE IS DIFFERENT) 

のように。

質問は、-338 ON句が無効であることを示していますか? AND F0.EVNT_SQNBR = ...で始まるすべての行(含む)に対して

なぜ、どのように修正するのですか?

+1

。それを 'WHERE'節に移動することを検討してください。 – mustaccio

+0

WHERE句に移動すると暗黙のINNER JOINになりませんか? OUTER JOINが必要です。 – Ardia

+0

それはあなたがそれを行うかどうかに依存します。他にどんなオプションがありますか? – mustaccio

答えて

0

修飾子FN0は、JOIN SQL文には存在しません。私はあなたがF0を意味すると思う。

AND FX.FIELD_CODE = F0.FIELD_CODE 
AND FX.BUS_LN_SQNBR = F0.BUS_LN_SQNBR 
+0

ええ..コピーミス、実際にはF0。一定。 – Ardia

+0

結果はどのように見えますか? –

+0

これは非常に大きなSPUFIなので、私はちょうど短縮コードスニペットを提出しました。クライアント、FieldCode1Value、FieldCode2Value、...のようなものFieldCode9Value、OtherFieldsFromNotShownTablesNotPartofJoin – Ardia

1

あなたは `on`の句でのサブ選択を持つことはできません、私は推測する。このような何か...

WITH MAXES AS 
(
    SELECT FX.CLIENT_ID, FX.FIELD_CODE, FX.BUS_LN_SQNBR, FX.EVNT_SQNBR, Y.ASMT_TCD, Y.ASMT_TY_SQNBR, MAX(FX.EVNT_SQNBR) AS THEMAX 
    FROM FINANCE FX 
    JOIN CROSSREF Y ON FX.CLIENT_ID = Y.CLIENT AND FX.EVNT_SQNBR = Y.EVNT_SQNBR 
    GROUP BY 
    FX.CLIENT_ID , 
    FX.FIELD_CODE , 
    FX.BUS_LN_SQNBR, 
    FX.EVNT_SQNBR, 
    Y.ASMT_TCD, 
    Y.ASMT_TY_SQNBR 
) 
SELECT * 
FROM ASSESSMENT A 
LEFT JOIN FINANCE F0 ON F0.CLIENT = A.CLIENT AND F0.FIELD_CODE = 1 
LEFT JOIN MAXES M0 ON (M0.THEMAX, M0.ASMT_TCD, M0.ASMT_TY_SQNBR, M0.CLIENT_ID, M0.FIELD_CODE, M0.BUS_LN_SQNBR) = (F0.EVNT_SQNBR, A.ASMT_TCD, A.ASMT_TY_SQNBR, A.CLIENT, F0.FIELD_CODE, F0.BUS_LN_SQNBR) 
LEFT JOIN FINANCE F1 ON F1.CLIENT = A.CLIENT AND F1.FIELD_CODE = 2 
LEFT JOIN MAXES M1 ON (M1.THEMAX, M1.ASMT_TCD, M1.ASMT_TY_SQNBR, M1.CLIENT_ID, M1.FIELD_CODE, M1.BUS_LN_SQNBR) = (F1.EVNT_SQNBR, A.ASMT_TCD, A.ASMT_TY_SQNBR, A.CLIENT, F0.FIELD_CODE, F1.BUS_LN_SQNBR) 
LEFT JOIN FINANCE F2 ON F2.CLIENT = A.CLIENT AND F2.FIELD_CODE = 3 
LEFT JOIN MAXES M2 ON (M2.THEMAX, M2.ASMT_TCD, M2.ASMT_TY_SQNBR, M2.CLIENT_ID, M2.FIELD_CODE, M2.BUS_LN_SQNBR) = (F2.EVNT_SQNBR, A.ASMT_TCD, A.ASMT_TY_SQNBR, A.CLIENT, F0.FIELD_CODE, F2.BUS_LN_SQNBR) 
関連する問題