2

我有一个需要编写的语句(使用通用名称,因为这是为了工作)来更新表“tUpd”中的“updCol”列。tUpd 还有一个列“linkCol”,它存在于另一个表 tOther 中。tOther 有另一列“idCol”。

我的问题是更新 tUpd 中行的 updCol 值,这些行通过 linkCol 对应于具有给定 idCol 值的行。

我认为应该可行的一种解决方案如下;

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

但是,我担心这种方法会导致性能下降,因为我之前曾被警告过与性能相关的子查询 - 此子查询将为 tUpd 的每一行运行一次,这是正确的吗?

有没有人有更好的建议?

重要更新:我的工作场所不惜一切代价避免使用 SQL JOIN,更喜欢在 where 子句中使用,例如where a.col = b.col. 这可以说是相当尴尬,但允许在我不完全理解的特别是日志记录方面具有灵活性。所以,我正在寻找不使用 JOIN 的解决方案:)

4

4 回答 4

7

上述所有解决方案都会在 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 回答
1

这适用于 Informix 数据库:

UPDATE dest_table V 
SET field_1 = 
   (SELECT field_1 FROM source_tbl WHERE field_2 IS NULL
   AND field_1 = V.field_1);

参考

于 2018-08-01T14:46:41.460 回答