我正在使用SQL Server 2014并利用由Microsoft提供的AdventureWorks2012
示例数据库。使用子查询删除重复行
我试图删除使用下面的子查询(选项#2)重复行:
/*选项#2:SUBQUERY */
--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
是的,非常感谢。我想过这个问题。只是想知道如何在不改变表格定义的情况下绕过它。 – enigma6205
你可以用cte –
我可以。我用它。如上面的代码所示。只是想探索不同的选择。 – enigma6205