2010-10-15 28 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