Как я могу иметь внутреннее соединение и выражение регистра в операторе обновления DB2? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий оператор обновления MSSQL, который содержит внутреннее соединение и выражение случая в операторе обновления, можно ли преобразовать оператор обновления в состояние обновления DB2.

UPDATE LIBNAME1.OPTR_POS_FIX
SET VAL_TYPE = @VAL_TYPE
,PORT_SNAME = @PORT_SNAME
,ISIN_NO = @ISIN_NO
,SEC_SNAME = @SEC_SNAME
,SEC_CCY_ABBR = @SEC_CCY_ABBR
,BASE_CCY = @BASE_CCY
,TRX_BCCY_EX_RATE = @TRX_BCCY_EX_RATE
,QUANTITY = @QUANTITY
,MKT_PRICE = @MKT_PRICE
,AVG_COST = @AVG_COST
,MVAL_AMT_SC = ROUND(@QUANTITY * @MKT_PRICE / (
        CASE 
            WHEN FDBVAL.VLGTI = 100
                THEN 100
            ELSE 1
            END
        ), 3)
,MVAL_AMT_BC = ROUND(@QUANTITY * @MKT_PRICE / (
        CASE 
            WHEN FDBVAL.VLGTI = 100
                THEN 100
            ELSE 1
            END
        ) / @TRX_BCCY_EX_RATE, 3)
,AVG_BVAL_SC = @AVG_BVAL_SC
,AVG_BVAL_BC = @AVG_BVAL_BC
,INT_AMT_SC = @INT_AMT_SC
,INT_AMT_BC = @INT_AMT_BC
FROM LIBNAME1.OPTR_POS_FIX
INNER JOIN LIBNAME2.FDBVAL ON OPTR_POS_FIX.SEC_CODE = FDBVAL.VLVALR
WHERE (OPTR_POS_FIX.VALN_DATE = @VALN_DATE)
AND (OPTR_POS_FIX.PORT_CODE = @PORT_CODE)
AND (OPTR_POS_FIX.SEC_CODE = @SEC_CODE)

Я ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Так вы бы написали оператор UPDATE в Db2

UPDATE LIBNAME1.OPTR_POS_FIX F
SET VAL_TYPE      = @VAL_TYPE
,PORT_SNAME       = @PORT_SNAME
,ISIN_NO          = @ISIN_NO
,SEC_SNAME        = @SEC_SNAME
,SEC_CCY_ABBR     = @SEC_CCY_ABBR
,BASE_CCY         = @BASE_CCY
,TRX_BCCY_EX_RATE = @TRX_BCCY_EX_RATE
,QUANTITY         = @QUANTITY
,MKT_PRICE        = @MKT_PRICE
,AVG_COST         = @AVG_COST
,AVG_BVAL_SC      = @AVG_BVAL_SC
,AVG_BVAL_BC      = @AVG_BVAL_BC
,INT_AMT_SC       = @INT_AMT_SC
,INT_AMT_BC       = @INT_AMT_BC
,(MVAL_AMT_SC, MVAL_AMT_BC)
 = (SELECT ROUND(@QUANTITY * @MKT_PRICE / (CASE WHEN F.VLGTI = 100 THEN 100 ELSE 1 END ), 3) 
    ,      ROUND(@QUANTITY * @MKT_PRICE / (CASE WHEN F.VLGTI = 100 THEN 100 ELSE 1 END ) / @TRX_BCCY_EX_RATE, 3)
    FROM  LIBNAME2.FDBVAL V
    WHERE  F.SEC_CODE = V.VLVALR
    )
WHERE 
    VALN_DATE  = @VALN_DATE
AND PORT_CODE  = @PORT_CODE
AND SEC_CODE   = @SEC_CODE
AND EXISTS ( 
    SELECT 1
    FROM  LIBNAME2.FDBVAL V
    WHERE  F.SEC_CODE = V.VLVALR
)
0 голосов
/ 05 октября 2018

Возможно, что-то вроде этого, при условии, что @ var - это некоторые параметры приложения:

MERGE INTO LIBNAME1.OPTR_POS_FIX O
USING LIBNAME2.FDBVAL F ON O.SEC_CODE = F.VLVALR
AND (O.VALN_DATE = @VALN_DATE)
AND (O.PORT_CODE = @PORT_CODE)
AND (O.SEC_CODE = @SEC_CODE)

WHEN MATCHED THEN UPDATE SET 
  VAL_TYPE = @VAL_TYPE
, ...
, MVAL_AMT_SC = ROUND(@QUANTITY * @MKT_PRICE / (
        CASE 
            WHEN F.VLGTI = 100
                THEN 100
            ELSE 1
            END
        ), 3)
, ...
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...