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我认为有一个独特的组合键我们没有看到。我们试图使用相同的方法。如果你愿意,可以使用。我们尝试使用相同的方法。如果你喜欢,可以用。