2013-05-30 100 views
2

我有一个两列ID的表,描述为SQL唯一查询

ID列不唯一。

我想删除查询,这将使该表必须在ID列的唯一值。

例如,如果这是我当前的表

ID说明

- 5  ABC 
- 5  DEF 
- 6  XDX 
- 6  KKK 
- 7  AAA 

我想修改表格,使其成为

ID说明

- 5  ABC 
- 6  XDX 
- 7  AAA 

(我要离开只有一排每个ID,无所谓哪列,例如第一行)

我用mysql

+0

哪个RDBMS您正在使用? –

+0

工作你想删除dups,或只是从查询中省略它们吗? – Bohemian

回答

2

“我想查询这将使该表必须在ID列的唯一值。”

这会给你每个ID一个记录。

SELECT ID, MIN(Description) Description 
FROM tableName 
GROUP BY ID 

这里有一个delete语句删除重复ID,只留在桌子上唯一ID

警告:这会从表中删除记录。

DELETE a 
FROM tableName a 
     LEFT JOIN 
     (
      SELECT ID, MIN(Description) Description 
      FROM tableName 
      GROUP BY ID 
     ) b ON a.ID = b.ID AND 
       a.Description = b.Description 
WHERE b.ID IS NULL 
+1

我认为他需要更新。 – CRDave

+0

如果你想删除一些重复的'ID',你能告诉我你使用的是什么RDBMS? –

+0

@CRDave - 你的意思是删除,但可以使用给定的语句*(容易或很难取决于dbengine)*删除记录。 OP应该提到dbms。 –

0

在PostgreSQL,你可以做到这一点。

delete 
from table1 
where (id, description) not in 
    (select id, min(description) 
    from table1 
    group by id); 

我会看看MySQL是否支持行构造函数。

(后来:MySQL的确实支持行构造函数,但another limitation防止这种情况的工作“目前,您无法从表中删除,并从子查询相同的表中选择。“)

1

Uthe最优雅的方式是使用MySQL的多表删除的语法和加入表本身:

delete d 
from mytable t 
join mytable d on d.id = t.id 
    and d.description > t.description 

此查询的关键部分是大于-的description比较,这不只有停止同一行加入,也可以预见选择重复删除。