【发布时间】:2018-01-03 21:20:40
【问题描述】:
我正在尝试使用其他两个表中的键更新连接表。连接表 (TableC) 已经填充了来自 TableA 的数百万个键。以下查询在不到两分钟的时间内更新了所有行(非常可接受);但是,如果存在类似的行,则每一行都应唯一匹配。 (TableB 中的键不应在 TableC 中重复 - TableA 中的每条记录都应与 TableB 中的唯一记录匹配。)
UPDATE TableC
SET TableC.TableBkey = b.TableBkey
FROM TableC AS c
INNER JOIN TableA AS a ON a.TableAkey = c.TableAkey
INNER JOIN TableB AS b ON b.col1 = a.col1 AND b.col2 = a.col2 AND b.col3 = a.col3
WHERE c.TableBkey IS NULL
这使得查询无限期地运行而不更新任何记录;可能连接无法完成。
AND NOT EXISTS (SELECT TOP 1 TableBkey FROM TableC AS x WHERE x.TableBkey = b.TableBkey)
是否有任何其他方法可以限制 TableB 中的重复键而不影响性能?我不想使用触发器。
【问题讨论】:
-
您查看过查询的执行计划吗?哪里被屏蔽了?索引的状态是什么?
-
如果b.TableBkey 已经存在于TableC 列TableBkey 中,您的意思是不应该更新为TableC.TableBkey?
-
如何将tableB 替换为在tableB 中查找记录的子查询,而tableBkey 不在tableC.tableBkey 中?使用左外连接获取连接的补集。 stackoverflow.com/questions/25849807/…
-
如果目标中有重复的匹配键,那么如果您运行此更新查询两次,它将在每种情况下更新任意记录。如果您每次只尝试更新多个可能匹配项中的一个,是的,这会发生,但是每次运行更新时,它都会选择一个任意匹配项。
-
谢谢@Nick.McDermaid。没有重复的键,只有相似的记录。如果三列匹配,则匹配哪些键并不重要,只要它们一对一匹配即可。
标签: sql sqlperformance