gpt4 book ai didi

sql - 使用一对多连接的 SQL 更新行为

转载 作者:行者123 更新时间:2023-12-02 00:06:15 25 4
gpt4 key购买 nike

假设我有两张 table , t1 t2 . t1 有两个字段,一个包含名为 的唯一值另一个字段名为 .表 t2 有一个不包含唯一值的字段,称为 b 还有一个字段也叫 .
现在,如果我使用以下更新查询(这是使用 MS Access 顺便说一句):

UPDATE t1
INNER JOIN t2 ON t1.a=t2.b
SET t1.value=t2.value

如果我有以下数据
     t1                  t2
a | value b | value
------------ ------------
'm' | 0.0 'm'| 1.1
'm'| 0.2

并运行查询 t1.value 中的值是什么?我进行了一些测试,但找不到一致的行为,所以我猜它可能只是未定义。或者这种更新查询是不应该做的?关于我为什么必须这样做,有一个很长很无聊的故事,但这与我的调查的技术性质无关。

最佳答案

这被称为非确定性查询,它的意思是您发现可以多次运行查询而不更改查询或基础数据并获得不同的结果。

实际上,该值将使用遇到的最后一条记录进行更新,因此在您的情况下,它将被更新两次,但第一次更新将被最后一次覆盖。您完全无法控制的是 SQL 引擎 Access 记录的顺序,它会以它认为合适的任何顺序 Access 它们,这可能只是从一开始的聚簇索引扫描,或者它可以使用其他索引并 Access 聚集索引以不同的顺序。你没有办法知道这一点。多次运行更新很可能会产生相同的结果,因为在不更改数据的情况下,sql 优化器将使用相同的查询计划。但同样没有保证,因此您不应依赖非确定性查询来获得确定性结果。

编辑

要将 T1 中的值更新为 T2 中对应的最大值,您可以使用 DMax :

UPDATE  T1
SET Value = DMax("Value", "T2", "b=" & T1.a);

关于sql - 使用一对多连接的 SQL 更新行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com