我在 SQL Server 中有一个更新语句,其中可以根据连接分配四个可能的值。 SQL 似乎有一种算法可以选择一个值而不是另一个值,但我不确定该算法是如何工作的。
举个例子,假设有一个名为 Source 的表,其中有两列(匹配和数据),结构如下:
(匹配列仅包含 1,数据列每行递增 1)
匹配数据
`--------------------------
1 1
1 2
1 3
1 4
该表将更新另一个名为 Destination 的表,其结构相同的两列如下:
匹配数据
`--------------------------
1 NULL
如果您想通过以下方式更新 Destination 中的 ID 字段:
UPDATE
目的地
SET
数据=源.数据
从
目的地
内部联接
来源
ON
目标.匹配 = 源.匹配
运行此查询后,Destination.ID 将设置为四个可能的选项。我发现弄乱源的索引会对目标的设置产生影响,并且 SQL Server 似乎只是用它找到的第一个匹配的值更新目标表。
准确吗? SQL Server 是否有可能按顺序用每个可能的值更新目标,而我最终得到的结果与用它找到的第一个值进行更新时的结果相同?它似乎会随机选择一行进行更新,而不是在出现这种情况时抛出错误,这似乎可能是有问题的。
谢谢。
附:对于糟糕的格式,我深表歉意。希望意图是明确的。
It sets all结果到数据。查询后最终得到哪一个取决于返回结果的顺序(最后设置哪一个)。
由于没有 ORDER BY 子句,因此您可以使用 Sql Server 给出的任何顺序。这通常遵循磁盘上记录的物理顺序,而通常又遵循表的聚集索引。但这个顺序并不是一成不变的,特别是在涉及连接时。如果联接与具有聚集索引以外的索引的列相匹配,则它很可能会根据该索引对结果进行排序。最后,除非您给它一个 ORDER BY 子句,否则 Sql Server 将以它认为最快的顺序返回结果。
您可以通过将更新查询转换为选择查询来玩这个,这样您就可以看到结果。请注意对于目标表的每条记录,源表中哪条记录位于最前面,哪条记录位于最后。将其与更新查询的结果进行比较。然后再次使用您的索引并再次检查结果以查看您得到的结果。
当然,这里可能很棘手,因为 UPDATE 语句不允许使用 ORDER BY 子句,因此无论您找到什么,您都应该真正编写连接,以便它与目标表 1:1 匹配。您可能会发现 APPLY 运算符对于实现此目标非常有用,并且您可以使用它来有效地联接到另一个表并保证联接仅匹配一条记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)