Sql server SQL SERVER 2012,1000万行,匹配同一表中的多个字段以获得结果

Sql server SQL SERVER 2012,1000万行,匹配同一表中的多个字段以获得结果,sql-server,optimization,Sql Server,Optimization,在名为#Temp的临时表中有1000万条记录。这些列是 PrimaryKey, FIELD1, FIELD2, FIELDS3, FIELD4, FIELD5, FIELD6, DateField 其中PrimaryKey为数值型,而除DateField外的所有其他字段均为VarChar 现在我想从这个表中获取格式为的重复记录 IsDuplicate, PrimaryKey1, PrimaryKey2, DateField1, DateField2 目前,以下查询正在运行,但执行起来需要很长

在名为
#Temp
的临时表中有1000万条记录。这些列是

PrimaryKey, FIELD1, FIELD2, FIELDS3, FIELD4, FIELD5, FIELD6, DateField
其中PrimaryKey为数值型,而除DateField外的所有其他字段均为VarChar

现在我想从这个表中获取格式为的重复记录

IsDuplicate, PrimaryKey1, PrimaryKey2, DateField1, DateField2
目前,以下查询正在运行,但执行起来需要很长时间

   With DATA
(SELECT d.FIELD1 AS key1, d.* FROM #TEMP d WHERE  d.FIELD1 IS NOT NULL
UNION ALL
SELECT d.FIELD2 AS key1, d.* FROM #TEMP d WHERE  d.FIELD2 IS NOT NULL
UNION ALL
SELECT d.FIELD3 AS key1, d.* FROM #TEMP d WHERE  d.FIELD3 IS NOT NULL
UNION ALL
SELECT d.FIELD4 AS key1, d.* FROM #TEMP d WHERE  d.FIELD4 IS NOT NULL
UNION ALL
SELECT d.FIELD5 AS key1, d.* FROM #TEMP d WHERE  d.FIELD5 IS NOT NULL
)
SELECT distinct IsDuplicate, PK1, PK2, DATE1, DATE2
FROM
(
SELECT CASE WHEN CASE WHEN T1.FIELD1 = T2.FIELD1 AND T1.FIELD1 IS NOT NULL AND T1.FIELD1 != ' ' THEN 1 ELSE 0 END+CASE
WHEN T1.FIELD2 = T2.FIELD2 AND T1.FIELD2 IS NOT NULL AND T1.FIELD2 != '' THEN 1 ELSE 0 END+CASE
WHEN T1.FIELD3 = T2.FIELD3 AND T1.FIELD3 IS NOT NULL AND T1.FIELD3 != '' THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD4 = T2.FIELD4 AND T1.FIELD4 IS NOT NULL THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD5 = T2.FIELD5 AND T1.FIELD5 IS NOT NULL AND T1.FIELD5 != '' THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD6 = T2.FIELD6 AND T1.FIELD6 IS NOT NULL AND T1.FIELD6 != '' THEN 1 ELSE 0 END >= 4 THEN 1 ELSE 0 END AS IsDuplicate,
CASE
WHEN T1.FIELD1 = T2.FIELD1 AND T1.FIELD1 IS NOT NULL AND T1.FIELD1 != ' ' THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD3 = T2.FIELD3 AND T1.FIELD3 IS NOT NULL AND T1.FIELD3 != '' THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD4 = T2.FIELD4 AND T1.FIELD4 IS NOT NULL THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD5 = T2.FIELD5 AND T1.FIELD5 IS NOT NULL AND T1.FIELD5 != '' THEN 1 ELSE 0 END+
CASE WHEN T1.FIELD6 = T2.FIELD6 AND T1.FIELD6 IS NOT NULL AND T1.FIELD6 != '' THEN 1 ELSE 0 END AS IsPotential, 
T1.PK AS PK1, T2.PK AS PK2, T1.Date AS DATE1, T2.Date AS DATE2
FROM Data T1
INNER JOIN Data T2 ON T1.key1 = T2.key1
) R where R.IsDuplicate = 1
OR R.IsPotential >= 3
寻找一种替代方法,以优化的方式获得所需的结果


谢谢。

索引?执行计划?没有相关信息就无法提供帮助?如果您有10万行,为什么要使用临时表?您是否向该表添加了索引?最后,期望的结果是什么?这个查询是做什么的?看起来它只是在尝试加载所有内容?@Alcapoon第二组案例中没有字段2是否是一个错误销售错误?是否有可能出现两次以上的值?您的输出格式可能无法很好地处理这种情况…您好!上面查询中使用的字段名是伪字段名…实际字段名类似于名字、姓氏、州、邮政编码、,电子邮件等……1000万行是从实际物理表加载到临时表中的相关字段,用于处理所需结果……在您的
案例
语句中,您执行的
T1.FIELD2=T2.FIELD2和T1.FIELD2不为NULL
,但根据
ANSI_NULLS
设置,通常不需要包含
T1.FIELD2不为NULL
,因为
NULL
不等于任何内容,包括另一个
NULL