1

現在、データベースに ~8000 行を含む URL リダイレクト テーブルがあり、そのうち ~6000 行が重複しています。

特定の列の値に基づいてこれらの重複を削除できる方法があるかどうか疑問に思っていました。一致する場合は、「old_url」列を使用して重複を見つけようとしています。

SELECT old_url
    ,DuplicateCount = COUNT(1)
FROM tbl_ecom_url_redirect
GROUP BY old_url
HAVING COUNT(1) > 1  -- more than one value
ORDER BY COUNT(1) DESC -- sort by most duplicates

ただし、重複したものだけをすべて失いたくないので、今すぐそれらを削除するために何ができるかわかりません。new_url が異なり、毎回 url_id (GUID) が異なる場合があることを除けば、それらはほぼ完全に一致します。

4

3 に答える 3

0

これは、GUID を使用して複数のレコードを削除するサンプルです。お役に立てば幸いです u=)

DECLARE @t1 TABLE
(
DupID UNIQUEIDENTIFIER,
DupRecords NVARCHAR(255)
)

INSERT INTO @t1 VALUES 
(NEWID(),'A1'),
(NEWID(),'A1'),
(NEWID(),'A2'),
(NEWID(),'A1'),
(NEWID(),'A3')

そのため、@t1 に guid を持つ複製レコードが作成されます。

;WITH CTE AS(
SELECT DupID,DupRecords, Rn = ROW_NUMBER()
OVER (PARTITION BY DupRecords ORDER BY DupRecords)
FROM @t1 
)
DELETE FROM @t1 WHERE DupID IN (SELECT DupID FROM CTE WHERE RN>1)

上記のクエリでは、重複したレコードは @t1 から削除されます。Row_number() を使用して各レコードを区別します

SELECT * FROM @t1
于 2013-08-21T07:11:17.897 に答える
0

テーブルに主キーがある場合、これは簡単です。

BEGIN TRAN
CREATE TABLE #T(Id INT, OldUrl VARCHAR(MAX))

INSERT INTO #T VALUES 
    (1, 'foo'),
    (2, 'moo'),
    (3, 'foo'),
    (4, 'moo'),
    (5, 'foo'),
    (6, 'zoo'),
    (7, 'foo')

DELETE FROM #T WHERE Id NOT IN (
    SELECT MIN(Id) 
    FROM #T 
    GROUP BY OldUrl
    HAVING COUNT(OldUrl) = 1
    UNION 
    SELECT MIN(Id) 
    FROM #T 
    GROUP BY OldUrl
    HAVING COUNT(OldUrl) > 1)

SELECT * FROM #T

DROP TABLE #T

ROLLBACK
于 2013-08-21T07:06:51.983 に答える