首页 > 解决方案 > Sql 获取具有 2 个字段的重复项,但具有一个字段是唯一的

问题描述

MNO PNO  PAK
33   44  T
33   44  T
33   44  K
33   45  T
33   46  T
34   46  T
34   47  T
35   47  T

你好。我在浪费时间好几个小时。我希望我能找到答案。

我想检索其中一个 mno 具有不同且不同的至少 2 个 pno 的行。并且 pak 总是应该是 t。

因此,对于给定的表,只有有效值是:

MNO PNO  PAK
33   44  T
33   45  T
33   46  T

因为其他 mno 的“T”pak 没有超过 2 个不同的 pno。

我尝试这样做以获得至少 3 个有效的不同行:

SELECT distinct e1. mno,e1. pno   from emq e1
INNER JOIN  emq e2 on (e1.MNO=e2.MNO and e1.PNO <>e2.PNO)
INNER JOIN  emq e3 on (e1.MNO=e3.MNO and e2.MNO=e3.MNO
                                     and e1.PNO <>e3.PNO and e2.PNO <>e3.PNO)
where e1.PAK='T' and e2.PAK='T' and e2.pak='T' and  exists
(SELECT  distinct e4.    pno,MNO from
      emq e4 where e4.pak='T'  group by   e4.    pno,MNO
having count( distinct e4.    pno,HAYMNO) >2);

但它做不到。存在的部分是为每个 mno 验证至少 3 个不同的行,但不能成功。例如要测试,

选择不同的 e4。pno from emq e4 where e4.pak='T' and HAYMNO=33 group by e4. 无

我这样做了。它正确检索

44 45 46 但是当我添加计数时

having count(  *) >2

标签: sql

解决方案


聚合和having子句怎么样?

select mno
from emq
group by mno
having min(pno) <> max(pno) and
       min(pak) = max(pak) and
       min(pak) = 'T';

如果您想要原始数据,您可以使用join, in, 或exists返回它们:

select emq.*
from emq join
     (select mno
      from emq
      group by mno
      having min(pno) <> max(pno) and
             min(pak) = max(pak) and
             min(pak) = 'T'
     ) m
     on m.mno = emq.mno;

推荐阅读