2013-04-30 68 views
1

我有这样一个表,看起来像下面这样:表具有唯一的行,但是如何找到某些列的重复项?

ID   TID  TNAME  CID  CNAME  SEQUENCE 
----------------------------------------------------------- 
200649  6125  Schalke 356954 Mirko   1 
200749  6125  Schalke 356954 Mirko   1 
200849  6125  Schalke 439386 Fred   1 
200849  6125  Schalke 356954 Mirko   1 
200849  6125  Schalke 495881 Michael  1 
200949  6125  Schalke 401312 Felix   1 
200949  6125  Schalke 495881 Michael  2 

我想查询该表,以便它只有ID和顺序重复返回。也就是说,它应该只返回:

200849  6125  Schalke 439386 Fred   1 
200849  6125  Schalke 356954 Mirko   1 
200849  6125  Schalke 495881 Michael  1 

我用having count(ID) > 1但由于CID组都是独一无二的它不会返回任何东西。

感谢您的帮助!

回答

3

我认为这是一个办法做到这一点:

select a.* 
from yourTable as a 
inner join (
    select id, sequence 
    from yourTable 
    group by id, sequence 
    having count(id)>1) as b on a.id = b.id and a.sequence=b.sequence 
+0

非常感谢! – user1683987 2013-04-30 16:57:40

2

像这样的东西?

SELECT b.id, 
     b.tid, 
     b.tname, 
     b.cid, 
     b.cname, 
     b.sequence 
FROM (SELECT id, 
       sequence, 
       Count(*) CNT 
     FROM table1 
     GROUP BY id, 
        sequence 
     HAVING Count(*) > 1) a 
     LEFT JOIN table1 b 
       ON b.id = a.id 
       AND b.sequence = a.sequence 

结果

|  ID | TID | TNAME | CID | CNAME | SEQUENCE | 
--------------------------------------------------------- 
| 200849 | 6125 | Schalke | 439386 | Fred |  1 | 
| 200849 | 6125 | Schalke | 356954 | Mirko |  1 | 
| 200849 | 6125 | Schalke | 495881 | Michael |  1 |

See the demo

+0

你不需要加入sequence-id就够了(毕竟这是关键 - 所有其他列都不需要标识该行) – Bohemian 2013-04-30 15:45:27

+0

@Bohemian如果你是对的,那么就不会有重复的条目在'Id'列 – Barranka 2013-04-30 15:47:00

+0

@Bohemian第二次看,因为'id'&'序列'成为唯一对,我认为'序列'也需要加入。 – Kermit 2013-04-30 15:48:38

2

我喜欢使用分析功能为这些事情:

select t.* 
from (select t.*, count(*) over (partition by id, sequence) as cnt 
     from t 
    ) t 
where cnt > 1 

这也给你输出中每行的重复次数。

+0

正在尝试使用相同的方法。如果你愿意,可以使用[这个SQL小提琴代码示例](http://sqlfiddle.com/#!3/432b7/1)。 – Yaroslav 2013-04-30 15:48:11