【问题标题】:Update referencing another table更新引用另一个表
【发布时间】:2012-09-19 11:13:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql sql-update informix


    【解决方案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)
    

    编辑:来自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)
    

    【讨论】:

      【解决方案2】:

      就是这样

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

      【讨论】:

      • 所以我不需要在FROM 部分中包含DestinationTable?很有趣。
      • 那么,最好的答案是什么? :)
      • 我已经编辑将 UpdateColumn 设置为 XXX,但它仍然需要在 WHERE 中添加一个额外的部分来检查 SourceTable,例如 IDColumn,如原始问题中所述。目前,它仍然是另一个答案:)
      • 你说服了我,哈哈,我对 SO 还很陌生,不太确定哪个更好,是对问题的具体答案还是对问题类型的一般解决方案。我会选择后者。
      • 尽管官方文档指出了这个解决方案 (ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.sqlt.doc/…),但它似乎不起作用....Dipesh Shah 的解决方案是唯一适合我的解决方案....
      【解决方案3】:

      也许对你有帮助

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

      Here 链接到类似问题。

      【讨论】:

      • 除了将 updCol 列的值设置为 id 之外,这不是预期的效果(我只想将其设置为预定义的值),这看起来像正确的事情。我不知道我可以在 UPDATE 查询中使用 FROM
      • 我编辑了这篇文章。现在 Value XXX 将更改 updCol 列。没事吧?
      • 根据documentationUPDATE 语句不支持 Informix 中的FROM 子句。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 2011-06-29
        相关资源
        最近更新 更多