因此我无法让此声明正常工作。 我有一个包含4列的表:ID,CertID,GroupID,CompID。 随着时间的推移,数据库已经收集了一些重复的行,我的意思是在所有列上都是一个副本,而不包括ID字段,这是其键。
我总是试图在实际的DELETE语句之前使SELECT语句工作,这样我就不必恢复备份的数据库了。
这是我最近一直在尝试的事情:
SELECT u1.* FROM CertMain AS u1, CertMain AS u2
WHERE u1.CertID = u2.CertID
AND u1.GroupID = u2.GroupID
AND u1.CompID = u2.CompID
但这似乎没有给我我想要的东西,感谢任何帮助谢谢
----------------------------------
| ID | CertID | GroupID | CompID |
|----|--------|---------|--------|
| 1 | 1 | 4 | 1 | <---Duplicate Row
| 2 | 1 | 4 | 3 | <---NOT A Duplicate Row (All 3 must match)
| 3 | 1 | 4 | 1 | <---Duplicate Row
| 4 | 8 | 3 | 5 |
| 5 | 10 | 1 | 1 |
----------------------------------
答案 0 :(得分:1)
如何使用group by
?
select CertID, GroupID, CompID, group_concat(id)
from CertMain
group by CertID, GroupID, CompID
having count(*) > 1;
这会将所有ID放在一行。
如果您想要实际行,请使用exists
:
select cm.*
from CertMain cm
where exists (select 1
from CertMain cm2
where cm2.certid = cm.certid and cm2.groupid = cm.groupid and
cm2.compid = cm.compid and cm2.id <> cm.id
);
编辑:
如果你想把它变成MySQL中的delete
,那就麻烦了。如果group by
具有不错的表现,那么您可以这样做:
delete cm
from CertMain cm join
(select CertID, GroupID, CompID, min(id) as minid
from CertMain
group by CertID, GroupID, CompID
) cm2
on cm2.certid = cm.certid and cm2.groupid = cm.groupid and
cm2.compid = cm.compid and cm.id > cm2.minid;
在执行删除之前,您应该将当前表保存在另一个表中。另请注意,如果三个ID中的任何一个为NULL
,这将无法正常工作。
答案 1 :(得分:0)
您可以使用connectHTTP(requests, completion: {
(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
NSLog(response)
})
子句来查找重复的行,如下所示:
exp_date = 1.day.ago.strftime("%a, %d %b %Y 00:00:00 GMT")
response.headers['Set-Cookie'] = "key%5Fmaquina=; path=/; domain='domain.com'; expires=#{exp_date};"
答案 2 :(得分:-1)
根据您目前的情况,您发现每一行都有自己的副本,其中u1.ID = u2.ID
。
您需要比较u1.ID > u2.ID
SELECT u1.* FROM CertMain AS u1, CertMain AS u2
WHERE u1.CertID = u2.CertID
AND u1.GroupID = u2.GroupID
AND u1.CompID = u2.CompID
AND u1.ID > u2.ID