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 分钟。

有什么方法可以更快更准确地完成相同的任务?

4

1 回答 1

1

[...]SQL Server 不能说 NULL = NULL,当我在所有列上保留 ISNULL 函数时,查询需要 20-30 分钟。

这并不完全正确。出于此比较的目的,您可以将 ansi_nulls 设置为关闭。请注意,此功能可能在未来的 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

如果这不能解决您的性能问题,您可能需要研究索引或更好的硬件以使查询运行得更快,或者退后一步重新分析正在发生的事情,然后重构解决方案。乍一看,这似乎是一个不寻常的操作(在非常相似的表之间复制数据,但仅在所有这些数据的匹配上),但提供准确的表定义、要求和示例可能会有很长的路要走帮助他人了解可以改变的地方。

于 2012-10-03T14:03:04.557 回答