我有一个包含这样的详细信息的表,person_item(id,person_id,item_name,value)。对于某些person_id和item_name,这应该是唯一的,这意味着如果我运行sql脚本,
SELECT name,Count(*) FROM person_item GROUP BY person_id, item_name
所有选择应该只有一个。但是,我发现重复数据,并且对于每个person_id和item_name对,有时它显示多于1行。我想做的是保留每个GROUP BY的第一行并删除副本。算法应该是这样的,
1. FROM person_item GROUP BY person_id, item_name
2. if Count(*)>1, remain the first one and delete the rest
但是,我不知道如何在不创建新表的情况下编写此类SQL脚本。谢谢。
答案 0 :(得分:0)
如果您想要一个唯一约束,我建议您将其添加到架构并让数据库强制执行它。您不应该处于必须编写此查询的位置。
听起来这是一个多对多的JOIN表,主键应该是(person_id,item_name)。这将保证唯一性。
答案 1 :(得分:0)
我在MySql上测试了以下内容,它达到了目的。你需要做的两件事
1.你必须引入一个唯一的行标识符 - 在你的情况下,我认为id是为了那个目的
2.您必须在编辑>中禁用MySql安全更新;偏好> Sql编辑器 如果您的行ID不是主键
create table test2 (
rowid varchar(10),
id varchar(20),
person_id varchar(20),
item_name varchar(20),
value varchar(20));
insert into test2
(rowid,id, person_id,item_name,value)
values ('1','1','1','first item','first value');
insert into test2
(rowid,id, person_id,item_name,value)
values ('2','1','1','first item','first value');
commit;
SELECT item_name,Count(*) FROM test2 GROUP BY person_id, item_name;
DELETE FROM Test2
WHERE rowid NOT IN (SELECT *
FROM (SELECT MAX(n.rowid)
FROM test2 n
GROUP BY n.person_id, n.item_name) x);
SELECT item_name,Count(*) FROM test2 GROUP BY person_id, item_name;
N.B。如果您是创建架构的人 - 可能您不能删除数据 - 所以之前 你试试这个,一定要在游戏区域进行。