2

1 つの列に基づいて重複を見つける必要がある多くの列を持つテーブルがあります。

customer_nameつまり、その後で重複がCustomer_name見つかった場合

  1. ソース テーブルからすべての繰り返しを削除する必要があります。
  2. これらすべての行を同じ構造の他のテーブルに送信します。
4

3 に答える 3

2

これを試して:

複製の移動用

INSERT Into DuplicatesTable
SELECT *
FROM 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Customer_name ORDER BY Customer_name) As RowID,
FROM SourceTable)  as temp
WHERE RowID > 1

検出用:

WITH TableCTE
AS
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY Customer_name ORDER BY Customer_name) AS RowID
FROM SourceTable
)
DELETE
FROM TableCTE
WHERE RowID> 1
于 2012-09-06T10:09:18.923 に答える
2

各行には一意の Id 主キーがあると思います。

これにより、重複行テーブルに挿入されます。

Insert into duplicateRowsTable
select * from myTable t1
where (select count(*) from myTable t2 where t1.customerId = t2.customerId) > 1

duplicateRowsTable から適切な行を削除します。

delete from duplicatesTable
where --this is not the faulty row for each customerId

最後に、最初のテーブルから削除します:

delete from myTable
where id IN (select id from duplicatesTable)
于 2012-09-06T09:55:46.450 に答える
2

次のような 2 つのテーブルがある場合:

CREATE TABLE t1 (ID int, customerName varchar(64))
CREATE TABLE t2 (ID int, customerName varchar(64))

次のようなものを作成できます: (ID 列は、何を保持するかを決定するためのものであり、必要に応じて変更できます)

--First Copy

WITH CTE_T1
AS
(
SELECT
  ID,
  customerName,
  ROW_NUMBER() OVER(PARTITION BY customerName ORDER BY ID) as OrderOfCustomer
  FROM 
  t1
)
INSERT INTO t2
SELECT ID, customerName FROM cte_T1
WHERE OrderOfCustomer > 1;

--Then Delete

WITH CTE_T1
AS
(
SELECT
  ID,
  customerName,
  ROW_NUMBER() OVER(PARTITION BY customerName ORDER BY ID) as OrderOfCustomer
  FROM 
  t1
)
DELETE FROM CTE_T1
WHERE OrderOfCustomer > 1

これがどのように機能するかを示すSQLFiddleです。

于 2012-09-06T10:01:00.273 に答える