2012-07-23 65 views
10

asked this question a while back刪除基於列的重複記錄。答案很好:我可以刪除基於多列的數據庫副本嗎?

delete from tbl 
where id NOT in 
(
select min(id) 
from tbl 
group by sourceid 
) 

我現在有一個類似的情況,但重複記錄的定義是基於多列。如何修改上面的SQL以確定重複的記錄,其中唯一記錄被定義爲從Col1 + Col2 + Col3連接起來。我會做這樣的事嗎?

delete from tbl 
where id NOT in 
(
select min(id) 
from tbl 
group by col1, col2, col3 
) 
+0

原理仍然存在 - 分組是由一個還是多個列組成並不重要。您將只保留組中的第一行。但是 - 如果您不介意我說 - 在發出刪除之前一定要檢查您的數據。轉換刪除選擇,看看什麼將不會生存。 – 2012-07-23 14:41:52

+0

@Nikola Markovinovic - 它看起來像做正確的事情,但只是想確認 – leora 2012-07-23 15:00:11

+0

@leora我發現你使用的語法繁瑣的概念化/逆向工程。它不能很好地轉化爲id可能爲空的情況(因爲在不涉及空值的情況下,'not in'的行爲不如您預期的那樣)。我意識到這不太可能是一個因素,但重要的是要了解有關CTE和不存在的情況下,它可能... – 2012-07-23 15:20:29

回答

23

這表明你想保留的行:

;WITH x AS 
(
    SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
     (PARTITION BY col1, col2, col3 ORDER BY id) 
    FROM dbo.tbl 
) 
SELECT col1, col2, col3 FROM x WHERE rn = 1; 

這說明你要刪除的行:

;WITH x AS 
(
    SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
     (PARTITION BY col1, col2, col3 ORDER BY id) 
    FROM dbo.tbl 
) 
SELECT col1, col2, col3 FROM x WHERE rn > 1; 

而且一旦你高興的是,以上兩組是正確的,下面實際上會刪除它們:

;WITH x AS 
(
    SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
     (PARTITION BY col1, col2, col3 ORDER BY id) 
    FROM dbo.tbl 
) 
DELETE x WHERE rn > 1; 

請注意,在所有三個查詢中,前6行是相同的,只有在CTE後面的後續查詢發生了變化。

+0

偉大的解決方案亞倫! – mark1234 2014-06-20 15:17:12

+0

極好的解決方案。 – CheGuevarasBeret 2015-09-17 15:47:18

4

試試這個。 我創建了一個表格tblA有三列。

CREATE TABLE tblA 
(
id int IDENTITY(1, 1), 
colA int, 
colB int, 
colC int 
) 

並添加了一些重複的值。

INSERT INTO tblA VALUES (1, 2, 3) 
INSERT INTO tblA VALUES (1, 2, 3) 
INSERT INTO tblA VALUES (4, 5, 6) 
INSERT INTO tblA VALUES (7, 8, 9) 
INSERT INTO tblA VALUES (7, 8, 9) 

如果在下面的語句中將select替換爲delete,那麼您的多列刪除將起作用。

SELECT MIN(Id) as id 
FROM 
(
SELECT COUNT(*) as aantal, a.colA, a.colB, a.colC 
FROM tblA  a 
INNER JOIN tblA b ON b.ColA = a.ColA 
        AND b.ColB = a.ColB 
        AND b.ColC = a.ColC 
GROUP BY a.id, a.colA, a.colB, a.colC 
HAVING COUNT(*) > 1 
) c 
INNER JOIN tblA d ON d.ColA = c.ColA 
        AND d.ColB = c.ColB 
        AND d.ColC = c.ColC 
GROUP BY d.colA, d.colB, d.colC 
+1

「三角形自動連接」*工程*,但如此笨重...... – ErikE 2012-12-01 02:08:02

相關問題