如何识别SQL表中的逻辑重复项

sky*_*e01 1 sql-server

我在SQL Server 2008中工作.我有一个非常简单的表,其中包含单元测试的数据.我们称之为table_A.它只有3列:col_1,col_2和col_3因为它用于单元测试,所有3列都有数据类型varchar(255).没有定义主键,索引或任何其他约束.

col_1和col_2包含我的自然键.我想确定此表中是否有任何重复的自然键.我知道至少有一项很好的技术.这是ROW_NUMBER,OVER,PARTITION BY,ORDER BY技术.另一个我不确定的是以下内容:

SELECT *
FROM table_A
WHERE
col_1 + ' ' + col_2
IN
(
SELECT
col_1 + ' ' + col_2
FROM table_A
GROUP BY col_1, col_2
HAVING COUNT(1) > 1
)
Run Code Online (Sandbox Code Playgroud)

这个其他技术会在每个实例中返回与ROW_NUMBER技术相同的结果吗?如果是这样,性能是否与ROW_NUMBER技术大致相同?

Ano*_*non 5

比较查询计划:

--Windowing Functions (faster)
WITH cte AS (
  SELECT *
    ,c= COUNT(*) OVER (PARTITION BY col_1,col_2)
  FROM MyTable
)
SELECT *
FROM cte
WHERE c > 1;

--Inner Join (slower)
SELECT t1.*
FROM MyTable t1
INNER JOIN (
  SELECT
    col_1
   ,col_2
  FROM MyTable
  GROUP BY col_1,col_2
  HAVING COUNT(*) > 1
) t2
ON (
      t1.col_1 = t2.col_1 
  AND t1.col_2 = t2.col_2
);

--Corellated Subquery (slower)
SELECT t1.*
FROM MyTable t1
WHERE EXISTS (
  SELECT 1
  FROM MyTable t2
  WHERE t1.col_1 = t2.col_1 
    AND t1.col_2 = t2.col_2
  GROUP BY col_1,col_2
  HAVING COUNT(*) > 1
);
Run Code Online (Sandbox Code Playgroud)

不要使用密钥连接. 它无法区分这两行:

INSERT MyTable
  (col_1,col_2)
VALUES
  ('a b','c'  )
 ,('a'  ,'b c')
Run Code Online (Sandbox Code Playgroud)

在这两行中col_1 + ' ' + col_2 = 'a b c'.