プロが教える店舗&オフィスのセキュリティ対策術

PL/SQLでUPDATEする際、別のテーブルからの条件も付加し更新を行いたいのですが、可能でしょうか?
教えて下さい。
どうぞよろしくお願い致します。

テーブル名T_NAMEのSEI='1'の時以下のロジック処理を行いたいのです。

UPDATE T_ADRS
SET DLT_FLG = '1'
, USER_ID = inUSER_ID
, TNMT_ID = inCOMP_ID
, UPD_DT = SYSDATE
WHERE RTRIM(ADR_CD) = RTRIM(strADR_CD)
AND RTRIM(DATA_SY) = RTRIM(strDATA_SY)
AND RTRIM(IMP_NO ) = RTRIM(strIMP_NO );

A 回答 (1件)

こんばんわ


ちょっと自信がないのですが・・・

質問の内容は、
1)必ずT_NAMEとリンクさせて、T_NAMEのSEIが'1'のデータのみ更新対象とする
2)T_NAMEに存在しないデータも更新対象とするが、T_NAMEのSEIが'1'のデータは
特別に更新項目が追加される
のどちら(又は、どちらでもない?)でしょうか?

まず1)の場合ですが、
UPDATE T_ADRS TBL_A
SET DLT_FLG = '1'
WHERE ...(中略)...
AND EXISTS(
 SELECT 1 FROM T_NAME TBL_N
 WHERE TBL_A.ID = TBL_N.ID
 AND TBL_N.SEI = '1'
 AND ROWNUM = 1)
とすれば実現できるかと。
EXISTSと言うのは「存在する」と言う意味で、
EXISTSに続く括弧内のSELECT文に対応するデータが存在するかどうかを判定してくれます。
で、実際のSELECT文の内容ですが、更新対象のテーブル「T_ADRS」と
条件判断様のテーブル「T_NAME」をリンクさせて、条件文を記述しています。
このSELECT文に該当するデータが存在する場合はEXISTSがTRUEになりますので、
更新対象となり、該当するデータが存在しない場合は更新対象になりません。

次に2)の方ですが、
UPDATE T_ADRS TBL_A
SET DLT_FLG = (
 SELECT DECODE( TBL_N.ID, '1', '1', TBL_A.DLT_FLG)
 FROM T_NAME TBL_N
 WHERE TBL_A.ID = TBL_N.ID(+)
 AND ROWNUM = 1 )
WHERE ...(後略)
で大丈夫だったと思います・・・
これは、SELECT文の内容をDLT_FLGにSETする・・・と言うSQLですが、
SELECTの内容はT_NAMEを外部結合しています。
これによって、T_NAMEが存在しない場合はそのままT_ADRSのDLT_FLGを使い、
存在しかつSETが'1'の場合は'1'で更新します。
※存在するがSEIが'1'では無い場合はDLT_FLGが使われます。

余り良いSQLでは無いかも知れませんが、
取りあえず思いついたのはこれくらいです。

長々と書いてしまいましたが、
的外れの回答だったら、すんません
    • good
    • 0
この回答へのお礼

まだ、試していませんが頑張ってやってみます。
迅速なアドバイスありがとうございました。

お礼日時:2002/02/25 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す