Oracle SQL 不重复计数,不输出使其不同的列

Oracle SQL distinct count without outputting columns that make it distinct

我有一个 table,我只想从中输出 1 个字段,因此它可以成为另一个查询的一部分 WHERE 语句 (WHERE SID IN (THIS NEW QUERY))。

然而,正因为如此,我只能在 SELECT 中包含 SID,但这将删除使非重复计数工作所需的内容。

SO SELECT * FROM Tablea 给我:

SID     deta    detb
22222   8159    3763
22222   8159    3763
44444   4739    6135
44444   4739    6135
44444   4739    6134
44444   4739    6135
55555   5937    0223
55555   5936    0223
66666   8577    9497
66666   8577    9497
66666   8577    9497
66666   8576    9496
66666   8577    9497
88888   3595    0919
88888   3595    0919
88888   3595    0919
88888   3595    0914
77777   5678    3456

然后 SELECT DISTINCT SID, deta, detb FROM Tablea 给我:

SID     deta    detb
22222   8159    3763
44444   4739    6134
44444   4739    6135
55555   5936    0223
55555   5937    0223
66666   8576    9496
66666   8577    9497
88888   3595    0914
88888   3595    0919
77777   5678    3456

我要的数据是这样的:

SID     deta    detb
44444   4739    6134
44444   4739    6135
55555   5936    0223
55555   5937    0223
66666   8576    9496
66666   8577    9497
88888   3595    0914
88888   3595    0919

这可以通过使用不同的计数来完成,但是我想要的最终输出是这样的:

SID     
44444  
55555  
66666   
88888   

但我只输出1个字段时无法实现

使用group by:

SELECT SID
FROM Tablea
GROUP BY SID
HAVING COUNT(DISTINCT deta || ':' || detab) > 1;

如果您确实想要完整的行(而不是 SID 值),则使用 window 函数:

SELECT a.*
FROM (SELECT a.*, COUNT(DISTINCT deta || ':' || detab) OVER (PARTITION BY SID) as cnt
      FROM tablea a
     ) a
WHERE cnt > 1;

我会这样做:

with sample_data (SID, deta, detb) as (select 22222, 8159, 3763 from dual union all
                                       select 22222, 8159, 3763 from dual union all
                                       select 44444, 4739, 6135 from dual union all
                                       select 44444, 4739, 6135 from dual union all
                                       select 44444, 4739, 6134 from dual union all
                                       select 44444, 4739, 6135 from dual union all
                                       select 55555, 5937, 0223 from dual union all
                                       select 55555, 5936, 0223 from dual union all
                                       select 66666, 8577, 9497 from dual union all
                                       select 66666, 8577, 9497 from dual union all
                                       select 66666, 8577, 9497 from dual union all
                                       select 66666, 8576, 9496 from dual union all
                                       select 66666, 8577, 9497 from dual union all
                                       select 88888, 3595, 0919 from dual union all
                                       select 88888, 3595, 0919 from dual union all
                                       select 88888, 3595, 0919 from dual union all
                                       select 88888, 3595, 0914 from dual union all
                                       select 77777, 5678, 3456 from dual)
--- end of mimicking your sample data
select sid
from   (select distinct sid,
                        deta,
                        detb
        from   sample_data)
group by sid
having count(*) > 1;


       SID
----------
     44444
     66666
     55555
     88888