Sql 表有唯一的行,但如何才能找到某些列的重复项?

Sql 表有唯一的行,但如何才能找到某些列的重复项?,sql,oracle,Sql,Oracle,我有一张如下所示的桌子: ID TID TNAME CID CNAME SEQUENCE ----------------------------------------------------------- 200649 6125 Schalke 356954 Mirko 1 200749 6125 Schalke 356954 Mirko 1 200849

我有一张如下所示的桌子:

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和序列重复时返回。i、 e.它只应返回:

200849     6125     Schalke    439386   Fred          1
200849     6125     Schalke    356954   Mirko         1
200849     6125     Schalke    495881   Michael       1
我使用了
having count(ID)>1
,但它不会返回任何内容,因为cid都是唯一的

谢谢你的帮助

像这样的

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 | |ID | TID | TNAME | CID | CNAME |序列| --------------------------------------------------------- |200849 | 6125 |沙尔克| 439386 |弗雷德| 1| |200849 | 6125 |沙尔克| 356954 |米尔科| 1| |200849 | 6125 |沙尔克| 495881 |迈克尔| 1| 像这样的事

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 | |ID | TID | TNAME | CID | CNAME |序列| --------------------------------------------------------- |200849 | 6125 |沙尔克| 439386 |弗雷德| 1| |200849 | 6125 |沙尔克| 356954 |米尔科| 1| |200849 | 6125 |沙尔克| 495881 |迈克尔| 1|
我认为这是一种方法:

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

我认为这是一种方法:

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

我喜欢用分析函数来处理这些事情:

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

这还提供了输出中每行上的重复数。

我喜欢使用分析函数来实现这些功能:

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

这还提供了输出中每一行的重复数。

您不需要按顺序联接-id就足够了(这毕竟是关键-不需要所有其他列来标识行)@Bohemian如果您是对的,那么
id中就不会有重复的条目column@Bohemian再看一眼,由于
id
sequence
是唯一的一对,我认为
sequence
也需要加入。等等@巴兰卡是对的。id列不是id列!查看数据-id不是唯一的。在这一点上,OP可能应该把它全部撕开,然后重新开始:/@Bohemian我想我们没有看到一个唯一的复合键。你不需要在序列上加入-id就足够了(毕竟它是键-所有其他列都不需要识别行)@Bohemian如果你是对的,这样,
Id
column@Bohemian再看看,由于
id
sequence
是唯一的一对,我认为
sequence
也需要加入。等等@巴兰卡是对的。id列不是id列!查看数据-id不是唯一的。在这一点上,OP可能会把它全部撕碎,然后重新开始:/@Bohemian我认为有一个独特的组合键我们没有看到。我们试图使用相同的方法。如果你愿意,可以使用。我们尝试使用相同的方法。如果你喜欢,可以用。