2011-02-24 128 views
0

我想根據類別ID從我的表中刪除重複的行,但不希望全部刪除,如果有多個具有相同類別ID的行,我想留下一行。刪除重複的行?

這是我的查詢我讓我需要改變它。

delete from twinhead_tblcategory where categoryid in (select categoryid from twinhead_tblcategory group by categoryid having count(categoryid) > 1) 
+3

您正在使用什麼數據庫? – czuroski 2011-02-24 14:24:07

+2

你能提供表格模式嗎? – 2011-02-24 14:27:18

+0

[刪除重複行(不刪除所有重複項)](http:// stackoverflow。com/questions/3777633/delete-duplicate-rows-dont-delete-all-duplicate) – jmort253 2013-11-07 02:16:25

回答

4

對於SQL Server,你可以做到這一點:

WITH MyTableCTE (CategoryId, RowNumber) 
AS 
(
    SELECT CategoryId, ROW_NUMBER() OVER (ORDER BY CategoryId) AS 'RowNumber' 
    FROM MyTable 

) 

Delete From MyTableCTE Where RowNumber > 1 
+0

請解釋我這與WITH MyTableCTE(CategoryId,RowNumber) 以及這兩個傳遞參數如何幫助這裏? – NoviceToDotNet 2011-02-24 14:57:00

+0

它被稱爲CTE(通用表表達式)看看:http://msdn.microsoft.com/en-us/library/ms190766.aspx那裏你可能會得到更多的信息! – RobertoBr 2011-02-24 16:30:34

4

做一個select distinct到一個新表,刪除舊,並重新命名新一成舊錶名。

1

這可能是笨手笨腳的,但也許你可以選擇不同的*到臨時表中,然後截斷表,然後在表中插入臨時表的內容。不過,外鍵約束可能會阻止這一點。

3

如果行有一個獨特的id列,那麼這應該工作:

DELETE t1 FROM your_table t1, your_table t2 
WHERE t1.column1 = t2.column1 AND t1.column2 = t2.column2 
AND ... /* check equality of all relevant columns */ 
AND t1.id < t2.id 
+0

這完全符合我的需求! – Keltex 2011-10-17 18:20:03

1

使用Sql Server,你可以通過全項,通過的categoryID下令使用遊標循環。

當前的ID是否與上一個相同?然後刪除它,參見this article的示例C. 否則請記住下一輪的ID。

0

您有刪除duplicate rows幾種方式。

我的解決方案,首先考慮該表例如

CREATE TABLE #Employee 
(
ID   INT, 
FIRST_NAME NVARCHAR(100), 
LAST_NAME NVARCHAR(300) 
) 

INSERT INTO #Employee VALUES (1, 'Vahid', 'Nasiri'); 
INSERT INTO #Employee VALUES (2, 'name1', 'lname1'); 
INSERT INTO #Employee VALUES (3, 'name2', 'lname2'); 
INSERT INTO #Employee VALUES (2, 'name1', 'lname1'); 
INSERT INTO #Employee VALUES (3, 'name2', 'lname2'); 
INSERT INTO #Employee VALUES (4, 'name3', 'lname3'); 

首先解決方法:使用另一臺用於重複行。

SELECT DISTINCT * 
FROM #Employee 

SELECT * INTO #DuplicateEmployee 
FROM #Employee 

INSERT #DuplicateEmployee 
SELECT DISTINCT * 
FROM #Employee 

BEGIN TRAN 
DELETE #Employee 
INSERT #Employee 
SELECT * 
FROM #DuplicateEmployee 

COMMIT TRAN 

DROP TABLE #DuplicateEmployee 

SELECT DISTINCT * 
FROM #Employee 

解決方法二:

SELECT DISTINCT * FROM #Employee 

SELECT * INTO #DuplicateEmployee FROM #Employee 

INSERT #DuplicateEmployee 
SELECT ID, 
    FIRST_NAME, 
    LAST_NAME 
FROM #Employee 
GROUP BY 
    ID,FIRST_NAME,LAST_NAME 
HAVING COUNT(*) > 1 

BEGIN TRAN 
DELETE #Employee 
FROM #DuplicateEmployee 
WHERE #Employee.ID = #DuplicateEmployee.ID 
AND #Employee.FIRST_NAME = #DuplicateEmployee.FIRST_NAME 
AND #Employee.LAST_NAME = #DuplicateEmployee.LAST_NAME 

INSERT #Employee 
SELECT * 
FROM #DuplicateEmployee 

COMMIT TRAN 
DROP TABLE #DuplicateEmployee 

SELECT DISTINCT * FROM #Employee 

滿含淚水的解決方案:使用rowcount

SELECT DISTINCT * 
FROM #Employee 

SET ROWCOUNT 1 
SELECT 1 
WHILE @@rowcount > 0 
    DELETE #Employee 
    WHERE 1 < (
      SELECT COUNT(*) 
      FROM #Employee a2 
      WHERE #Employee.ID = a2.ID 
       AND #Employee.FIRST_NAME = a2.FIRST_NAME 
       AND #Employee.LAST_NAME = a2.LAST_NAME 
    ) 

SET ROWCOUNT 0 

SELECT DISTINCT * 
FROM #Employee 

方案四:使用Analytical Functions

SELECT DISTINCT * 
FROM #Employee; 

WITH #DeleteEmployee AS (
        SELECT ROW_NUMBER() 
          OVER(PARTITION BY ID, First_Name, Last_Name ORDER BY ID) AS 
          RNUM 
        FROM #Employee 
       ) 

DELETE 
FROM #DeleteEmployee 
WHERE RNUM > 1 

SELECT DISTINCT * 
FROM #Employee 

第五的解決方案:使用identity

SELECT DISTINCT * 
FROM #Employee; 

ALTER TABLE #Employee ADD UNIQ_ID INT IDENTITY(1, 1) 

DELETE 
FROM #Employee 
WHERE UNIQ_ID < (
    SELECT MAX(UNIQ_ID) 
    FROM #Employee a2 
    WHERE #Employee.ID = a2.ID 
      AND #Employee.FIRST_NAME = a2.FIRST_NAME 
      AND #Employee.LAST_NAME = a2.LAST_NAME 
) 

ALTER TABLE #Employee DROP COLUMN UNIQ_ID 

SELECT DISTINCT * 
FROM #Employee 

,所有解決方案的最終使用此命令

DROP TABLE #Employee 

來源我的回答是this site

+0

你好,請不要在整個網站發佈重複的答案,因爲這會產生噪音。相反,如果您發現重複的帖子,請將它們標記爲重複項。您只需要15個信譽來標記帖子。有關詳細信息,請參見[重複答案](http://meta.stackexchange.com/questions/178223/why-were-all-my-copy-pasted-answers-to-duplicate-questions-deleted)。 – jmort253 2013-11-07 02:19:46

+0

你好@loup,你的答案被系統自動標記,並由主持人刪除。該系統旨在查找可疑或有問題的活動,並將其引入社區的注意。如果您修改帖子以修復鏈接,將其從「本網站」更改爲實際說出網站的名稱,以便有適當的歸因,我可以刪除該讚譽。祝你好運! – jmort253 2013-11-07 06:35:27

+0

如果您發現重複,請使用問題下的「標記」鏈接將其標記爲另一個問題的重複。請參閱[flag posts privilege](http://stackoverflow.com/help/privileges/flag-posts)頁面以獲取更多詳細信息。祝你好運! – jmort253 2013-11-07 06:47:14