2012-10-03 80 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

相關問題