Sql 通过检查其他表记录使表保持最新的有效方法
试图找出最有效的方法编写查询以使表保持最新 例如,我有3个表,我们把它们称为Sql 通过检查其他表记录使表保持最新的有效方法,sql,sql-server,duplicates,subquery,sql-insert,Sql,Sql Server,Duplicates,Subquery,Sql Insert,试图找出最有效的方法编写查询以使表保持最新 例如,我有3个表,我们把它们称为TableA,TableB和TableC 表A是需要使用唯一代码保持最新的表。所有3个表都有一个名为code的列 查询必须在TableB和TableC中查找TableA中不存在的唯一代码,并将它们插入TableA 请注意,TableB和TableC两个表中都有~55k记录和TableA ~1k。表中的记录数很少发生变化。一年最多可记录1k条记录 第一个选择我提出了以下建议,但不喜欢执行计划: INSERT INTO Ta
TableA
,TableB
和TableC
表A
是需要使用唯一代码保持最新的表。所有3个表都有一个名为code
的列
查询必须在TableB
和TableC
中查找TableA
中不存在的唯一代码,并将它们插入TableA
请注意,TableB
和TableC
两个表中都有~55k记录和TableA
~1k
。表中的记录数很少发生变化。一年最多可记录1k条记录
第一个选择我提出了以下建议,但不喜欢执行计划:
INSERT INTO TableA (Code)
SELECT DISTINCT Code FROM TableB WHERE Code NOT IN(SELECT Code FROM TableA)
UNION
SELECT DISTINCT Code FROM TableC WHERE Code NOT IN(SELECT Code FROM TableA)
还查看了显示左外连接的
选项。但无法连接3个表以获取TableA
中缺少的代码,但这些代码存在于TableB
或TableC
这里有一个选项,将所有的合并到两个表中,然后过滤掉不存在的和相关子查询
INSERT INTO TableA (code)
SELECT DISTINCT code
FROM (SELECT code FROM TableB UNION ALL SELECT code FROM TableC) t
WHERE NOT EXISTS (SELECT 1 FROM TableA ta WHERE ta.code = t.code)
您确实希望在TableA(code)
上有一个索引来加速子查询
INSERT INTO TableA (code)
SELECT DISTINCT code
FROM (SELECT code FROM TableB UNION ALL SELECT code FROM TableC) t
WHERE NOT EXISTS (SELECT 1 FROM TableA ta WHERE ta.code = t.code)
我想知道首先使用UNION
进行重复数据消除是否会提供更好的性能:
INSERT INTO TableA (Code)
SELECT Code
FROM (SELECT code FROM TableB UNION SELECT code FROM TableC) t
WHERE NOT EXISTS (SELECT 1 FROM TableA ta WHERE ta.code = t.code)
更好的问题是为什么你需要这样做。这闻起来像是一瓶酒。您似乎有意复制数据。这是否隐藏了一个在表之间没有(但应该)实际关系的模式问题?视图(无论是否物化)将自动使代码保持“最新”。遗留是您问题的答案。是的,表a中的代码列有唯一的索引。第二个查询的性能优于第一个查询(UNION而不是UNIONALL)。而且都比我的好。请注意,您的查询结果包含“NULL”结果,而我的查询结果没有。我猜t.code在查询结束时不为null,忽略null结果是解决方案吗?@akd:是的<代码>不存在(…)且t.code不为空时
将执行此操作。