Совместное обновление в Oracle - PullRequest
0 голосов
/ 04 декабря 2018

привет, я пытаюсь обновить таблицу из запроса на выборку, как показано ниже.Оператор Select дает около 30 записей, а оператор обновления дает 1300 записей.Какую ошибку я делаю в этом?

Update BLTU.BLT_1003_HDR HDR SET L_INSTITUTION = ( 
SELECT 
CASE 
   WHEN CO.CORR_TI LIKE 'B%' THEN '12345'
   WHEN CO.CORR_TI LIKE 'C%' THEN '54321'
END AS INSTITUTION 
FROM WC.CORRES CO,WC.LOANS LO 
            WHERE  LO.LOAN_ID = HDR.LOAN_ID
            AND LO.CORR_ID = CO.CORR_ID
            AND LO.CORR_ID NOT LIKE '111%'
            AND LO.L_CURRENT_STATUS_ID NOT IN (99,98,97)
            AND HDR.L_INSTITUTION IS NULL
             )

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я предлагаю вам использовать оператор MERGE, который IMO проще для понимания и имеет то преимущество, что при необходимости он также может вставлять новые данные в целевую таблицу (здесь не требуется):

MERGE INTO BLTU.BLT_1003_HDR HDR
  USING (SELECT LO.LOAN_ID,
                CASE 
                  WHEN CO.CORR_TI LIKE 'B%' THEN '12345'
                  WHEN CO.CORR_TI LIKE 'C%' THEN '54321'
                END AS INSTITUTION 
           FROM WC.CORRES CO
           INNER JOIN WC.LOANS LO 
             ON LO.CORR_ID = CO.CORR_ID AND
                LO.CORR_ID NOT LIKE '111%' AND
                LO.L_CURRENT_STATUS_ID NOT IN (99,98,97)) L
    ON (L.LOAN_ID = HDR.LOAN_ID)
  WHEN MATCHED THEN
    UPDATE SET HDR.L_INSTITUTION = COALESCE(HDR.L_INSTITUTION, L.INSTITUTION);

Желаем удачи.

0 голосов
/ 04 декабря 2018

Вам не хватает той части коррелированного запроса на обновление, которая позволяет выбрать, какие записи должны быть обновлены.Вы должны добавить к запросу WHERE EXIST предложение следующим образом:

UPDATE
    BLTU.BLT_1003_HDR HDR 
SET L_INSTITUTION = ( 
    SELECT 
        CASE 
            WHEN CO.CORR_TI LIKE 'B%' THEN '12345'
            WHEN CO.CORR_TI LIKE 'C%' THEN '54321'
        END AS INSTITUTION 
    FROM WC.CORRES CO,WC.LOANS LO 
    WHERE
        LO.LOAN_ID = HDR.LOAN_ID
        AND LO.CORR_ID = CO.CORR_ID
        AND LO.CORR_ID NOT LIKE '111%'
        AND LO.L_CURRENT_STATUS_ID NOT IN (99,98,97)
        AND HDR.L_INSTITUTION IS NULL
)
WHERE EXISTS (
    SELECT 1
    FROM WC.CORRES CO,WC.LOANS LO 
    WHERE
        LO.LOAN_ID = HDR.LOAN_ID
        AND LO.CORR_ID = CO.CORR_ID
        AND LO.CORR_ID NOT LIKE '111%'
        AND LO.L_CURRENT_STATUS_ID NOT IN (99,98,97)
        AND HDR.L_INSTITUTION IS NULL

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...