sql - 使用同一表上的选择更新行

标签 sql sql-update

我正在尝试使用同一表查询更新行。上下文:

ID        |  LANG       |  TEXT
----------------------------------
1         |  EN         |  Hello
1         |  FR         |
1         |  ES         |
2         |  EN         |  Boat
2         |  FR         |  Bateau
2         |  ES         |

我想要: 对于每一行;如果文本为空;使用具有相同 ID 且 LANG = 'EN' 的行的 TEXT 值更新它。

执行类似操作的 SQL 请求是什么?

最佳答案

您没有指定数据库。以下是标准SQL:

UPDATE t
    SET TEXT = (SELECT text
                FROM t t2
                WHERE t.id = t2.id AND LANG ='EN' AND
                      TEXT IS NOT NULL
               ) 
    WHERE TEXT IS NULL;

如果出现重复,则应执行以下操作:

UPDATE t
    SET TEXT = (SELECT max(text)
                FROM t t2
                WHERE t.id = t2.id AND LANG ='EN' AND
                      TEXT IS NOT NULL
               ) 
    WHERE TEXT IS NULL;

编辑:

当然,并非所有数据库都支持所有 ANSI 标准功能。在 MySQL 中,您可以使用 join 来代替:

UPDATE t JOIN
       (SELECT id, max(text) as text_en
        FROM t t2
        WHERE LANG ='EN' AND TEXT IS NOT NULL
       ) ten 
       ON t.id = ten.id
    SET t.TEXT = ten.text_en
    WHERE t.TEXT IS NULL;

关于sql - 使用同一表上的选择更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25266878/

相关文章:

c# - 将文本框值更新为 sql

postgresql - 在同一行 Postgres 中使用来自 jSON 的值更新新列

php - MySQL:是否可以在更新时对字段进行大小写?

如果存在具有 2 个特定列的行,则 MYSQL 更新表;如果不存在,则插入新行

php - SQL 命令在 Laravel 5.7 中未给出预期结果。我需要修改我的表或查询吗?

sql - 使用 SQL UPDATE 自动生成排序顺序

C# - ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态是关闭的

mysql - 这个mysql查询是什么意思?

mysql - 如何在 SQL 中更新以获得不同的元组/不违反唯一约束

mysql - 根据行在 MySQL 中是否存在执行 UPDATE 或 INSERT