2011-03-21 8 views
35

句を含むスタックを使用して結果を得て、その結果を表に書きたいスクリプトがあります。私はちょうどそれの周りに私の頭を得ることができない、誰かが正しい方向に私を指すことができますか?with文節を使用した更新文

ここで私が何をしたいかを示す簡単な例です:

with comp as (
    select *, 42 as ComputedValue from mytable where id = 1 
) 
update t 
set  SomeColumn = c.ComputedValue 
from mytable t 
     inner join comp c on t.id = c.id 

本物は全てが互いを参照句を持つかなりの数を持っているので、実際に句を使用して任意の提案は非常に好ましいであろうが、それをネストされたサブクエリにリファクタリングします。構文WITH事前に

おかげで、

ゲルト・ヤン

+2

FYI:あなたはそれを自分で答えていることを指摘して、あなたのタイトルと質問を編集する必要はありません。ソリューションを独自の回答として追加し、最適なソリューションを選択します。 –

+0

さて、それはまだ答えとしてマークすることはできませんでした。ありがとう! – gjvdkamp

+0

私も回答を探していました。私はここでそれを見つけました:http://stackoverflow.com/questions/7030699/oracle-sql-update-with-data-from-another-table – Bogdan

答えて

36

誰かが私の後に来たら、これは私のために働いた答えです。

update mytable t 
set z = (
    with comp as (
    select b.*, 42 as computed 
    from mytable t 
    where bs_id = 1 
) 
    select c.computed 
    from comp c 
    where c.id = t.id 
) 

幸運、

GJ

+3

これはすべての行を更新しませんか? c.id <> t.idの行がある場合、nullに設定されませんか?どこの句も外側に置く方法を誰かが知っていますか? –

+0

Oracleをもう使用しないでください。これはしばらく前です。それを試してみてください;-) IIRCこれは私のために働いた。 – gjvdkamp

+0

@gjvdkampこれは、Sanjay Nambiar氏の言ったように動作します。更新は選択された行で機能しますが、「どこから」外にあるすべての行はnullに設定されています。 [2]誰かがwhere節を外側に置く方法を知っていますか? – robsonrosa

24

ザ・は、例えば、インライン・ビューに有効であると表示されます

UPDATE (WITH comp AS ... 
     SELECT SomeColumn, ComputedValue FROM t INNER JOIN comp ...) 
    SET SomeColumn=ComputedValue; 

しかし、私はWITH句を排除するために書き直した場合、それは成功したものの、私は、これは常に、ORA-01732: data manipulation operation not legal on this viewで失敗した簡単なテストインチしたがって、リファクタリングは、キーの保全を保証するOracleの能力を妨げる可能性があります。

ただし、MERGEを使用できるはずです。あなたがこの投稿した簡単な例を使用することも、WITH句を必要としない:

MERGE INTO mytable t 
USING (select *, 42 as ComputedValue from mytable where id = 1) comp 
ON (t.id = comp.id) 
WHEN MATCHED THEN UPDATE SET SomeColumn=ComputedValue; 

しかし、私はあなたが出要因たい、より複雑なサブクエリを持って理解しています。 USING節のサブクエリを任意に複雑にし、複数のWITH句を組み込むことができると思います。

+1

こんにちは、すでに運営されている。私が使用するwith文は、平均値と標準偏差を計算するかなりのレベルを持ち、他のタブなどからの正規化(統計的)データはリファクタにとって本当の痛みではないことを使用します。この例は、更新構文です。 – gjvdkamp

関連する問題