我在SQL Server中有一个更新语句,其中有四个可以根据连接分配的值.似乎SQL有一个算法可以选择一个值而不是另一个值,我不确定该算法是如何工作的.
例如,假设有一个名为Source的表,其中两列(匹配和数据)的结构如下:(匹配列只包含1,数据列每行增加1)
匹配数据
`------ --------------------
1 1
1 2
1 3
1 4
该表将更新另一个名为Destination的表,其中两列结构如下:
Match
Data` --------------------------
1 NULL
如果要以下列方式更新Destination中的ID字段:
UPDATE
目标
SET
数据= Source.Data FROM
目标
INNER JOIN
源
ON
目标.Match = Source.Match
运行此查询后,将有四个可能的选项将Destination.ID设置为.我发现搞乱Source的索引会对Destination的设置产生影响,并且看起来SQL Server只是使用它找到匹配的第一个值来更新Destination表.
那是准确的吗?SQL Server是否可能按顺序更新每个可能值的Destination,并且最终得到的结果与使用它找到的第一个值进行更新时的结果相同?似乎可能有问题的是,它似乎随机选择一行进行更新,而不是在出现这种情况时抛出错误.
谢谢.
PS我为糟糕的格式道歉.希望,意图很明确.
Joe*_*orn 10
它将所有结果设置为数据.在查询之后你最终得到的是取决于返回结果的顺序(它最后设置的顺序).
由于没有ORDER BY子句,因此您可以使用Sql Server提供的任何顺序.这通常遵循磁盘上记录的物理顺序,而这通常遵循表的聚簇索引.但是这个顺序并不是一成不变的,特别是涉及连接时.如果连接匹配具有聚簇索引以外的索引的列,则可能会根据该索引对结果进行排序.最后,除非你给它一个ORDER BY子句,否则Sql Server将以它认为最快的顺序返回结果.
您可以通过将您的upate查询转换为选择查询来玩这个,这样您就可以看到结果.注意哪个记录首先出现,哪个记录最后出现在目标表的每个记录的源表中.将其与更新查询的结果进行比较.然后再次使用您的索引并再次检查结果以查看您获得的结果.
当然,这里可能很棘手,因为UPDATE语句不允许使用ORDER BY子句,因此无论你发现什么,你都应该真正编写连接,使其与目标表1:1匹配.您可能会发现APPLY运算符对实现此目标很有用,您可以使用它来有效地JOIN到另一个表并保证连接只匹配一个记录.
| 归档时间: |
|
| 查看次数: |
2244 次 |
| 最近记录: |