Sql 通过检查其他表记录使表保持最新的有效方法

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

试图找出最有效的方法编写查询以使表保持最新

例如,我有3个表,我们把它们称为
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不为空时
将执行此操作。