【问题标题】:SQL UPDATE statement to update a column based on another existing rowSQL UPDATE 语句根据另一个现有行更新列
【发布时间】:2012-02-22 08:15:04
【问题描述】:

基本上我有一个与下表格式相似的表格。

我要做的是根据这个逻辑更新 Col4

  • 如果 Col2 为空,则用 Col3 更新 Col4
  • 如果 Col2 不为空,则在 Col1 中找到与 Col2 中的值匹配的值。用 col3 中的相应值更新 col4

例如给定这张表:

| Col1 | Col2 | Col3 | Col4 |
-----------------------------
|  1   |   2  |  A1  |  2   |
-----------------------------
|  2   |   3  |  A2  |  3   |
-----------------------------
|  3   |{null}|  A3  |{null}|

更新为这张表

| Col1 | Col2 | Col3 | Col4 |
-----------------------------
|  1   |   2  |  A1  |  A2  |
-----------------------------
|  2   |   3  |  A2  |  A3  |
-----------------------------
|  3   |{null}|  A3  |  A3  |

任何方向将不胜感激!

【问题讨论】:

  • 哪个数据库?你都尝试了些什么?你看过 CASE 声明吗?
  • Im using MySQL 5.1. Ive 已经尝试了与 SQL Server 中的更新集类似的逻辑,但无济于事。我最终将实现一个 Case 语句,但我遇到的问题是当它不为空时执行逻辑
  • 你能发布你已经尝试过的代码,以及它给出的错误吗?

标签: mysql sql


【解决方案1】:

这样的东西应该可以工作(未经测试):

UPDATE  table
SET     col4 = CASE WHEN table.col2 IS NULL THEN table.col3 ELSE col2Matches.col3 END
FROM    table
        INNER JOIN table AS col2Matches
            ON  table.col2 = col2Matches.col1

这应该可以让你测试它:

SELECT  CASE WHEN table.col2 IS NULL THEN table.col3 ELSE col2Matches.col3 END
FROM    table
        INNER JOIN table AS col2Matches
            ON  table.col2 = col2Matches.col1

希望这会有所帮助,

皮特

【讨论】:

  • 当 Col2 为空时将其设为左外连接。
  • CASE WHEN 的第一部分负责将 Col2 设为 NULL。我将其设为 INNER,因为 OP 只关心它何时不为空。
  • 菲利普是对的。如果我将其设为内部连接,则会丢失第三行。
  • 我的意思是,虽然左连接肯定会完成工作,但您选择的行数超出了您的需要,这会降低查询效率。您确实从col2Matches 丢失了第3 行,但您不需要它,因为您从table 获得了该值(第3 行肯定存在)。无论哪种方式,很高兴我能提供帮助。
【解决方案2】:

这样的东西可能会在 Oracle 中工作。

update myTable
set col4 = case when col2 is null then col3
                else (select col3 from myTable where col1 = col2)
           end;

当然,如果select col3 from myTable where col1 = col2 返回多行,则此查询将不起作用。但我想你已经知道你的数据是否足够干净,可以正常工作。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2023-03-20
    • 2021-04-13
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多