2

テーブル「tUpd」の列「updCol」を更新するために(これは作業用であるため、一般的な名前で)書く必要があるステートメントがあります。tUpd には、別のテーブル tOther に存在する列「linkCol」もあります。tOther には別の列 'idCol' があります。

私の問題は、linkCol を介して特定の idCol 値を持つ行に対応する tUpd 内の行の updCol 値を更新することです。

私がうまくいくと思う解決策の1つは次のとおりです。

update
    tUpd
set
    updCol = XXX
where exists (
    select
        idCol
    from
        tOther
    where
        tOther.linkCol = tUpd.linkCol
    and tOther.idCol = MY_ID
)

ただし、以前にパフォーマンスに関連してサブクエリについて警告されていたため、このアプローチがパフォーマンスの低下につながるのではないかと心配しています-このサブクエリはtUpdの行ごとに1回実行されますが、これは正しいですか?

誰かがより良い提案を得ましたか?

重要な更新: 私の職場では、SQL JOIN の使用を絶対に避けており、たとえばwhere a.col = b.col. これは間違いなくやや厄介ですが、特に完全には理解していないロギングで柔軟性が得られます。SO、私はJOINを使用しないソリューションを探しています:)

4

4 に答える 4

7

上記のすべてのソリューションでは、テーブルの 1 つが見つからないため、Informix でエラーが発生します。これが私のために働いた解決策です:

update table1
set table1.field2 = (select table2.field2 from table2 where table1.field1 = table2.field1)
where table1.field1 in (select table2.field1 from table2)

編集:別の質問からの複数列のソリューション

update table1
set (table1.field2, table2.field3) = (
  (select table2.field2, table2.field3 
     from table2 
     where table1.field1 = table2.field1)
)
where table1.field1 in (select table2.field1 from table2)
于 2013-09-04T11:34:32.900 に答える
2

多分それはあなたを助けるでしょう

update tUpd
set tU.updCol = XXX
from tOther tot, tUpd tU   
where tot.linkCol = tU.linkCol
  and tot.idCol = MY_ID

ここに同様の問題へのリンクがあります。

于 2012-09-19T11:23:15.787 に答える
2

単にこのようなものです

UPDATE DestinationTable
SET DestinationTable.UpdateColumn =  SourceTable.UpdateColumn 
FROM SourceTable
WHERE DestinationTable.JoinColumn = SourceTable.JoinColumn
于 2012-09-19T11:35:55.760 に答える