簡體   English   中英

使用查詢結果更新表

[英]Update a Table with results of a Query

我想在我的一個表上更新一個新列,但我不確定如何解決這個問題。

新列為MARITAL_STATUS,位於SCV_CLEINT_DETAILS表中。 此表的值將從各種來源生成,下面的查詢將獲取我正在尋找的值:

SELECT scd.qsclient_id, 
       scd.system_client_id,
       NVL(c.paxus_client_id, c.client_id),
       UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) AS NewMarStatus,
       scd.marital_status
FROM scv_client_details scd, client c, paxus_client pc
WHERE scd.system_client_id = to_char(c.client_id)
AND  c.paxus_client_id = pc.client(+)
AND  UPPER(scd.SYSTEM_INDICATOR) = 'WRITEN'
AND (scd.marital_status <> UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) OR 
     scd.marital_status IS NULL)

我想用上面NewMarStatus中生成的值更新新的MARITAL_STATUS列。 我真的不知道如何寫更新語句。

任何幫助真的很感激。

我總是使用批量上傳程序來處理這些事情。

declare
    cursor cur
    is
    SELECT scd.rowid row_id,
           UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) AS marital_status
    FROM   scv_client_details scd, client c, paxus_client pc
    WHERE  scd.system_client_id = to_char(c.client_id)
    AND    c.paxus_client_id = pc.client(+)
    AND    UPPER(scd.SYSTEM_INDICATOR) = 'WRITEN'
    AND    (scd.marital_status <> UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) OR 
            scd.marital_status IS NULL)
    order by row_id
    ;

    type type_rowid_array is table of rowid index by binary_integer;
    type type_marital_status_array is table of scv_client_details.marital_status%type;

    arr_rowid type_rowid_array;
    arr_marital_status type_marital_status_array;

begin
    open cur;

    loop
        fetch cur bulk collect into arr_rowid, arr_marital_status;

        forall i in arr_rowid.first .. arr_rowid.last
            update scv_client_details tab
            SET    tab.marital_status = arr_marital_status(i)
            where  tab.rowid = arr_rowid(i)
            ;

        exit when cur%notfound;
    end loop;

    close cur;
    commit;

exception
  when others
    then rollback;
         raise_application_error(-20000, 'Fout bij uitvoeren update van scv_client_details(marital_status) - '||sqlerrm);
end;

在其他SO中描述了幾種更新連接的方法:

MERGE是進行批量連接更新的最簡單方法之一。 它可以很好地擴展,因為它可以使用所有形式的連接,尤其是HASH JOIN。

USING子句是您的查詢(顯然添加了rowid ):

MERGE INTO scv_client_details d
USING (SELECT NVL(c.paxus_client_id, c.client_id),
              UPPER(NVL(NVL2(c.paxus_client_id, 
                             pc.clt_mar_stat, 
                             c.maritial_status_code),
                        decode(c.client_type_id, '2000001702', 'C', 'U'))) 
              AS NewMarStatus,
              scd.ROWID rid
         FROM scv_client_details scd, client c, paxus_client pc
        WHERE scd.system_client_id = to_char(c.client_id)
          AND c.paxus_client_id = pc.client(+)
          AND (scd.marital_status <> 
               UPPER(NVL(NVL2(c.paxus_client_id, 
                             pc.clt_mar_stat, 
                             c.maritial_status_code),
                        decode(c.client_type_id, '2000001702', 'C', 'U')))
              OR
              scd.marital_status IS NULL)) v
ON (d.ROWID = v.rid)
WHEN MATCHED THEN
   UPDATE SET d.marital_status = newmarstatus;

有關完整示例,請參閱此SQLFiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM