我有一个声明,需要编写(使用通用名称,因为这是为了工作)来更新表'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使用的解决方案:)
答案 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);