获取在SQL表中具有两列相等的行组

时间:2011-12-02 21:56:14

标签: sql aggregate

所以我搞砸了,并填写了一张有重复行的桌子......我有一张这样的桌子(实际上很多像这样的东西:-():

id    gname     pname    value 
1     15         13       test 
2     15         13       test 
3     15         13       test
4     18         18       test
5     18         18       test 
6     18         18       test

此表仅允许允许同一个gname,pname和value的一行。

所以现在我需要编写一些sql,将所有这些常见行组合在一起并删除除ONE之外的所有行!哎呀!

任何人都可以帮助我,STEP ONE,我相信只是为了获得一份声明来返回所有重复组。

**顺便说一句 - 我知道这完全是顶了。这是我继承的一个非常古老的系统和一个大客户端,这是使用这个...所以我知道这些问题。我可以修复导致这个ONCE的代码,我把数据库恢复到应该的状态。

谢谢!

2 个答案:

答案 0 :(得分:4)

如果id是唯一的并且自动递增,则很容易:

DELETE Table
WHERE ID NOT IN (SELECT MIN(id)
                  FROM Table
                  GROUP BY gname, pname, value)

首先执行SELECT

答案 1 :(得分:0)

给它一个机会。它使用RANK函数来提取除了每个gname / pname / value元组的第一个元素。

DELETE a
FROM _table_ a
JOIN 
(
    SELECT id
        , RANK() OVER (PARTITION BY gname, pname, value ORDER BY id ASC) AS r
    FROM _table_
) b
    ON a.id = b.id
    AND b.r > 1