2012-03-04 18 views
0

トリガー内のselectステートメントに基づいて特定のデータを更新しようとしています。次のようにselect文は次のとおりです。選択クエリの結果を更新しますか?

SELECT col1 
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 

私は、トリガーで算出した新しい値にこの文から返されたデータを変更したいです。私はそれがこのようなものかもしれないと思ったe.col1 = COUNTERしかし、それは動作していないようです。このデータの更新に関する助けがあれば、幸いです。ありがとうございます。

EDIT:実際に必要なデータを取得するためにselectクエリを変更しました。上記の私は間違っていた。

UPDATE tbl2 SET col1 = COUNTER 
WHERE EXISTS(SELECT col1 
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2); 

Iは、SELECTクエリによって返されたデータとは対照的に、表の列全体が更新されることで上記のコードを使用する場合に問題であることを再度述べるべきです。

EDIT: TBL1はCOL2、列が含まれていたcolidと

TBL2は、トリガーがTBL1に挿入する前にある

COL1、列が含まれていたcolid。

+0

定義:data'の '特定の部分を。明確化: 'データが返されたリターンをすべてトリガで計算された新しい値に変更したい。 –

+0

特定のデータ - 選択クエリの列。そして私は、特定のデータをクエリから以前に計算した値に変更したいと思っていました。 – John

答えて

1

それは希望[私のSQL Serverはオラクルでは多少異なる構文かもしれない]

に加入がある場合に更新されますトリガーがどのテーブルにあったか、どのようなトリガー、どのテーブルにどの列があるかを教えてください。私はまだあなたがこれらのアップデートで何をしようとしているのか、まだ分かりません。

UPDATE tbl2 SET col1 = COUNTER 
WHERE EXISTS(SELECT col1 
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2); 

私はこの問題は、あなたの内側のSELECT文でLEFT JOINをやっていることだと思います。内部クエリには常に行があり、EXISTS句でこれを実行しているため、常に行に一致し、UPDATEはテーブルのすべての行で発生します。

多分これがあなたのために良い仕事します:

UPDATE tbl2 SET col1 = COUNTER 
WHERE EXISTS(SELECT col1 
FROM tbl1 d 
    INNER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2); 

を私は、このトリガーがTBL2上にある場合は、変異に実行する可能性が高いですので、これは、これを行うの悪い方法であると言うだろうテーブルの問題。

+0

こんにちは、お返事ありがとうございます。私はあなたが言った参加を試みたが、それはエラー無効なテーブル名でコンパイルされなかった。うん、それは私の愚かだった。あなたが要求した追加情報を追加しました。 – John

0

サブクエリでtbl2テーブルのエイリアシングを行っているので、それは更新されていない別のテーブルとして扱われます。実行する必要はありませんちょうど彼のテーブルTOT更新に参加していない存在、それが唯一のインナーが

update tbl2 
set col1 = (COUNTER) 
from tbl2 t2 
where tbl2.colid = t2.colid 
+0

私は何をする必要があるのか​​を変更しました。私はwhereステートメントがtbl1に属するcol2を参照しているので、selectを使う必要があると思います。 – John

0

私は質問で少し混乱していますが、私は、これはあなたが望むかもしれを推測

UPDATE tbl2 
SET col1 = COUNTER 
WHERE EXISTS (
    SELECT * 
    FROM tbl1 
    WHERE tbl1.colid = tbl2.colid 
    AND tbl1.col2 = :new.col2); 

UPDATE to columns of a subquery expressionを適用するには、Oracleの(非標準)機能もあります。
This pages demonstrates the feature

はあなたのために仕事ができる:

UPDATE (
    SELECT tbl2.col1 
    FROM tbl2 
    JOIN tbl1 USING (colid) 
    WHERE tbl1.col2 = :new.col2 
    ) t 
SET tbl2.col1 = COUNTER; 
関連する問題