【问题标题】:What is the SQL standard for updating one row when multiple are matched with an UPDATE+FROM当多个与UPDATE + FROM匹配时更新一行的SQL标准是什么
【发布时间】:2022-01-11 23:41:20
【问题描述】:

使用以下 SQL:

CREATE TABLE tableA (
 id int primary key, 
 local_id int not null
);

INSERT INTO tableA (id,local_id) VALUES
(122,0),(123,0),(124,0);

UPDATE tableA SET tableA.local_id = tableB.id
FROM (
    SELECT 1 AS id, 1 AS rn
    UNION
    SELECT 3 AS id, 1 AS rn
    UNION
    SELECT 2 AS id, 1 AS rn
) AS tableB
WHERE tableA.id = 123 AND tableB.rn = 1;

此 SQL 仅匹配 tableA 中的 1 行和 tableB 中的 3 行。

在这种情况下更新local_id 的规则是什么?在内部FROM 中没有ORDER BY,它似乎选择了最高的INT,但我怀疑这种行为是否明确? (在本例中为 3)。

这种行为是否在 SQL 标准中的某处定义? 如果我在括号内设置ORDER BY id DESC,我确定它总是会选择第一行吗?

这是一个简化的问题,通常在tableA 中更新超过 1 行,因此设置TOP/LIMIT 并不会减少它。

【问题讨论】:

  • 我们不知道tablea,也不知道您期望什么结果。所以edit 问题并提供minimal reproducible example,即涉及的表和/或其他对象的CREATE 语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据 (dito) 的语句以及表格文本格式的示例数据的所需结果。带有连接的UPDATEs 通常是特定于供应商的,因此请标记您正在使用的 DBMS 及其版本。
  • 所以这个问题更多的是关于 postgresql 如何决定选择哪个值。我认为这是随机的,但堆栈中第一个的概率更高。因此,降序排列,它更可能是最高值。测试 dbfiddle here
  • @LukStorms 我很欣赏小提琴,我已经更新了这个问题。这也发生在 MSSQL 中。所以在某个地方一定有一个规则或标准。
  • 好吧,在标准 SQL 中,不允许在 UPDATE 语句中以 FROM 开头。所以 SQL 标准对此没有什么可说的,因为它只是无效的(标准)SQL。
  • @a_horse_with_no_name 如果它不是标准,那么了解此行为是否在某处定义会很有趣。我可以保证如果我在内部使用ORDER BY 按预期工作,也就是选择第一行吗?如果对此没有任何定义,那么它基本上是在玩火。

标签: sql join sql-update


【解决方案1】:

当前查询只给出一个错误。您可以使用目标表中的 1 个值更新多行。但是您不能使用来自目标的多个值更新 1 行。因此,只需使目标表唯一。如您所述,获取最大值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多