0

テーブルの 1 つで新しい列を更新したいのですが、その方法がわかりません。

新しい列は 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 列を更新したいと思います。しかし、更新ステートメントの書き方が本当にわかりません。

どんな助けでも本当に感謝しています。

4

2 に答える 2

1

結合を更新するいくつかの方法は、この他の SO で説明されています。

MERGE一括結合更新を行う最も簡単な方法の 1 つです。あらゆる形式の結合、特に 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を参照してください。

于 2013-05-29T14:14:15.700 に答える