2012-10-03 42 views
0

我有两个表格,其中有很多列,这些列在很多情况下都是空值。以最快和最可靠的方式比较两个表格

比较两个表格数据的最佳方法是什么?

我使用下面的方法:

UPADTE TableB 
SET Col1 = A.Col1 
FROM TableA A INNER JOIN TableB B 
ON A.Col2 = B.Col2 AND A.Col3 = B.Col3 .... A.Col47 = B.Col47 

不知怎的,你也知道SQL Server不能说我可以这样写太多,但NULL = NULL,当我保持所有列上ISNULL函数,查询花费20 -30分钟。

有什么办法可以更快更准确地完成同样的任务吗?

+0

您正在比较或更新?你能保证这些表具有相同的列定义吗? [Redgate](http://www.red-gate.com/products/sql-development/sql-data-compare/)是一个很好的比较工具,还有其他的。 –

+0

@TimLehner这些表具有除表格A之外的相同列A具有不在表格B中的一列,并且表格B具有不在表格A中的2列。我必须在* ON *条件中使用的其他列具有相同的数据类型。 – Zerotoinfinity

+0

我的团队不允许在SQL Server以外的服务器上使用任何工具。我的客户没有心情为任何其他工具购买任何其他许可证:-( – Zerotoinfinity

回答

1

[...] SQL Server不能说NULL = NULL,当我保持所有列上ISNULL函数,查询花费20-30分钟。

这并非完全正确。就此比较而言,您可能需要set ansi_nulls off。请注意,此功能可能在将来的SQL Server版本中有一天不可用,但它至少在2012年才会出现。

set ansi_nulls on 
select 1 where 1 != null -- returns nothing 
select 1 where null = null -- returns nothing 
select 1 where null != null -- returns nothing 

set ansi_nulls off 
select 1 where 1 != null -- returns 1 
select 1 where null = null -- returns 1 
select 1 where null != null -- returns nothing 

如果这没有解决您的性能问题,你可能要考虑的索引或更好的硬件来获取查询运行得更快,或者退一步重新分析是怎么回事,然后重构的解决方案。乍一看,这似乎是一种不寻常的操作(在非常相似的表格之间复制数据,但仅限于所有数据的匹配),但提供确切的表格defs,要求和示例可能会有很长的路要走帮助他人了解可能发生的变化。

+0

很好的回答+1 – Zerotoinfinity

相关问题