2013-05-29 69 views
0

我想更新我的某个表格上的新列,但我不确定如何去解决这个问题。用查询结果更新表格

新列为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列。我真的不知道如何编写update语句。

任何帮助真的很感激。

+0

更新联接是可能的,例如,请参见:[Oracle - 具有内部联接的更新语句](http://stackoverflow.com/questions/2446764/oracle-update-statement-with-inner-join)。 –

+0

由于我的marital_status值可能来自客户端表,paxus_client表或基于客户端表中的client_type_id生成,我不知道如何使用连接?任何方式来更新scv_client_details表where marital_status字段是从这个查询的输出匹配从查询中返回的客户端ID也? – mcquaim

+2

使用'MERGE'作为演示在[这个答案](http://stackoverflow.com/a/2446859/119634)。 'MERGE INTO scv_client_details d USING(your_query)v ON v.rowid = d.rowid ...'。 –

回答

1

几种方法来更新加入这个其他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

+0

谢谢,这工作的一种享受..如果这工作,我不知道为什么我的ON(d.system_client_id = v.system_client_id)不起作用?无论如何,感谢厂家的帮助,真的很感激.. – mcquaim

+1

你需要'scv_client_details'主键和'system_client_id'似乎是'client'的PK。 –

1

我总是对这些东西使用批量上传过程。

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; 
+0

谢谢你。我正在考虑使用游标,但前提是我无法获得简单的更新查询。如果查询不可行,那么我会沿着这条路线走,谢谢! – mcquaim