2010-10-15 62 views
0

我想從表中刪除除了一個記錄以外的所有記錄,其中名稱字段重複相同的值超過5次,並且地址字段重複更多比一張桌子的五倍還多。因此,如果有5條記錄與名稱字段和地址字段是所有5個相同的,那我想刪除4,滿分5一個例子:使用sql來保留名稱字段和地址字段都在5+記錄中重複的單個記錄

id name address 
1 john 6440 
2 john 6440 
3 john 6440 
4 john 6440 
5 john 6440 

我只想要回1項紀錄從上面的5條記錄。

我仍然有這個問題。

1)我創建一個名爲KeepThese的表併爲其提供主鍵ID。 2)我創建了一個名爲delete_1查詢並複製到它的:

INSERT INTO KeepThese 
SELECT ID FROM 
(
SELECT Min(ID) AS ID 
FROM Print_Ready 
GROUP BY names_1, addresses 
HAVING COUNT(*) >=5 

UNION ALL 

SELECT ID FROM Print_Ready as P 
INNER JOIN 
(SELECT Names_1, addresses 
FROM Print_ready 
GROUP BY Names_1, addresses 
HAVING COUNT(*) < 5) as ThoseLessThan5 
ON ThoseLessThan5.Names_1 = P.Names_1 
AND ThoseLessThan5.addresses = P.addresses 
) 

3)我創建一個查詢名爲delete_2並拷貝到這一點:

DELETE P.* FROM Print_Ready as P 
LEFT JOIN KeepThese as K 
ON K.ID = P.ID 
WHERE K.ID IS NULL 

4)然後我跑delete_1。我得到一個消息,說: 「循環引用引起的別名ID」 所以我改變這片: FROM(SELECT MIN(ID)AS標識 這樣說: FROM(SELECT MIN(ID)AS ID2 然後我雙擊再次顯示一個彈出窗口,顯示輸入參數值爲ID.This表示它不知道什麼是ID,但是print_ready只是一個查詢,而它有一個ID,實際上是另一個表的ID被過濾到此查詢。

不知道該怎麼在這一點上做的。

+0

'最小(P.ID)由於ID'不應該含糊不清。但它似乎確實會遺漏掉很多SQL。 – 2010-10-19 01:44:06

回答

0

CREATE TABLE isolate_duplicates AS不肯定它的訪問工作,在你身邊應該給爲新表COUNT(*)的名稱。

這也許工作:

SELECT DISTINCT name, address 
     INTO isolate_duplicate 
     FROM print_ready 
     GROUP BY name + address 
     HAVING COUNT(*) > 4 

    DELETE print_ready 
     WHERE name + address 
     IN (SELECT name + address 
      FROM isolate_duplicate) 

    INSERT print_ready 
     SELECT * 
     FROM isolate_duplicate 

    DROP TABLE isolate_duplicate 

未經測試。

+0

另外names_1和地址在源表中不是有效的字段名稱。這個查詢充滿了錯誤。 – JohnFx 2010-10-15 02:55:36

+0

我使用不同的技術更新了我的帖子,但仍遇到問題。 – JohnMerlino 2010-10-17 22:49:33