gpt4 book ai didi

sql-server - sql server 如何在有多个选项的更新语句中选择值?

转载 作者:行者123 更新时间:2023-12-02 18:28:14 25 4
gpt4 key购买 nike

我在 SQL Server 中有一个更新语句,其中可以根据连接分配四个可能的值。 SQL 似乎有一种算法可以选择一个值而不是另一个值,但我不确定该算法是如何工作的。

举个例子,假设有一个名为 Source 的表,其中有两列(匹配和数据),结构如下:(匹配列仅包含 1,数据列每行递增 1)
匹配数据
`--------------------------
1 1
1 2
1 3
1 4

该表将更新另一个名为“Destination”的表,其具有相同的两列,结构如下:
匹配数据
`--------------------------
1 空

如果您想通过以下方式更新 Destination 中的 ID 字段:

UPDATE
Destination
SET
Data = Source.Data FROM
Destination
INNER JOIN
Source
ON
Destination.Match = Source.Match

运行此查询后,Destination.ID 将设置为四个可能的选项。我发现弄乱源的索引会对目标的设置产生影响,并且 SQL Server 似乎只是用它找到的第一个匹配的值更新目标表。

这准确吗? SQL Server 是否有可能按顺序用每个可能的值更新目标,而我最终得到的结果与用它找到的第一个值进行更新时的结果相同?它似乎会随机选择一行进行更新,而不是在出现这种情况时抛出错误,这似乎可能是有问题的。

谢谢。

附注对于格式不佳,我深表歉意。希望意图是明确的。

最佳答案

它将所有结果设置为数据。查询后最终得到哪一个取决于返回结果的顺序(最后设置哪一个)。

由于没有 ORDER BY 子句,因此您可以使用 Sql Server 给出的任何顺序。这通常遵循磁盘上记录的物理顺序,而通常又遵循表的聚集索引。但这个顺序并不是一成不变的,特别是在涉及连接时。如果联接与具有聚集索引以外的索引的列相匹配,则它很可能会根据该索引对结果进行排序。最后,除非您给它一个 ORDER BY 子句,否则 Sql Server 将以它认为最快的任何顺序返回结果。

您可以通过将更新查询转换为选择查询来玩这个,这样您就可以看到结果。请注意对于目标表的每条记录,源表中哪条记录位于最前面,哪条记录位于最后。将其与更新查询的结果进行比较。然后再次使用您的索引并再次检查结果以查看您得到的结果。

当然,这里可能很棘手,因为 UPDATE 语句不允许使用 ORDER BY 子句,因此无论您找到什么,您都应该真正编写联接,以便它与目标表 1:1 匹配。您可能会发现 APPLY 运算符对于实现此目标非常有用,并且您可以使用它来有效地联接到另一个表并保证联接仅匹配一条记录。

关于sql-server - sql server 如何在有多个选项的更新语句中选择值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1370462/

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