我在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技术大致相同?
比较查询计划:
--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'.
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |