【发布时间】:2016-09-19 04:40:55
【问题描述】:
我正在使用 SQL Server 2014 并利用 Microsoft 提供的 AdventureWorks2012 示例数据库。
我正在尝试使用下面的子查询删除重复的行(选项 #2):
/* 选项 #2:子查询 */
--SELECT * FROM
DELETE SQLPractice.[dbo].[CURRENCY]
WHERE EXISTS (SELECT *
FROM
(SELECT
NAME,
ROW_NUMBER () OVER (PARTITION BY NAME ORDER BY NAME) AS Flag
FROM
SQLPractice.[dbo].[CURRENCY]) AS T
WHERE Flag > 1)
GO
但它会从表中删除所有行。
但另一个选项 (CTE) 确实只删除了重复的行。
/*** Option #3: CTE ***/
;WITH RepFlag AS
(
SELECT
NAME,
ROW_NUMBER () OVER (PARTITION BY NAME ORDER BY NAME) AS Flag
FROM
SQLPractice.[dbo].[CURRENCY]
)
--SELECT * FROM RepFlag
DELETE RepFlag
WHERE Flag > 1
SELECT *
FROM SQLPractice.[dbo].[CURRENCY]
请使用以下代码创建您自己的测试表。
/*** REMOVING DUPLICATE ROWS OPTION ***/
-- Creating a table
SELECT TOP 0 *
INTO [dbo].[CURRENCY]
FROM AdventureWorks2012.Sales.Currency
WHERE NAME LIKE '%A';
-- inserting duplicate rows
INSERT [dbo].[CURRENCY]
SELECT * FROM AdventureWorks2012.Sales.Currency
WHERE NAME LIKE '%A';
/***** SELECTING COUNT OF DUPLICATED ROWS *****/
/*** Option #1: "GROUP BY" with "HAVING" ***/
SELECT
NAME, COUNT(*) AS Qty
FROM
SQLPractice.[dbo].[CURRENCY]
GROUP BY
NAME
HAVING
COUNT(*) >1
GO
【问题讨论】:
标签: sql sql-server duplicates subquery