【发布时间】: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