更新引用另一个表

时间:2012-09-19 11:13:03

标签: sql sql-update informix

我有一个声明,需要编写(使用通用名称,因为这是为了工作)来更新表'tUpd'中的列'updCol'。 tUpd还有一个列'linkCol',它存在于另一个表中。还有另一栏'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 a.col = b.col加入where子句。这可能相当尴尬,但允许我特别是日志记录的灵活性,我不完全理解。所以,我正在寻找非JOIN使用的解决方案:)

4 个答案:

答案 0 :(得分:6)

以上所有解决方案都会在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)

编辑:来自another question

的多列解决方案
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)

答案 1 :(得分:2)

也许它会帮助你

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

Here是类似问题的链接。

答案 2 :(得分:2)

就像这样

UPDATE DestinationTable
SET DestinationTable.UpdateColumn =  SourceTable.UpdateColumn 
FROM SourceTable
WHERE DestinationTable.JoinColumn = SourceTable.JoinColumn

答案 3 :(得分:0)

这适用于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);

Reference