私は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