Return 唯一行并删除 oracle sql 查询中的无关行

Return unique row and get rid of extraneous row in oracle sql query

我有一个通常会给我三行结果的 oracle 查询。两个是相同的,而第三个只是额外的一行。如何修改此查询以仅获取唯一结果。下面是查询语句:

select prt.oid, it.itemname, it1.itemname, prt1.oid from jrtp_rdb.jrtepartoccurrence prt
join jrtp_rdb.jnameditem it on it.oid = prt.oid
join jrtp_rdb.xdistribports x on x.oidorigin = prt.oid
join jrtp_rdb.xflowports x1 on x1.oiddestination = x.oiddestination
join jrtp_rdb.xgeneratesconnectionitems x2 on x2.oidorigin= x1.oidorigin
join jrtp_rdb.xownsimplieditems x3 on x3.oiddestination = x2.oiddestination
join jrtp_rdb.jnameditem it1 on it1.oid = x3.oidorigin
join jrtp_rdb.jrtepartoccurrence prt1 on prt1.oid = it1.oid
where prt.oid in
('00013885000000004C00426DEC534269');

结果如下table所示:

00013885000000004C00426DEC534269    Flange-120491   Gate Valve-65650    0001388500000000AB3BEAC87354D9BE
00013885000000004C00426DEC534269    Flange-120491   Gate Valve-65650    0001388500000000AB3BEAC87354D9BE
00013885000000004C00426DEC534269    Flange-120491   Flange-120491       00013885000000004C00426DEC534269

在这种情况下,我只想要第一行,因为它给出了连接到闸阀的法兰的名称。如何修改查询以仅获取唯一行并删除额外的第三行?

查找重复项的最简单方法是添加唯一的行标识符,例如在真实物理表的情况下添加 ROWID:

select prt.oid, it.itemname, it1.itemname, prt1.oid 
,count(distinct  prt.rowid)  prt_cnt
,count(distinct   it.rowid)   it_cnt
,count(distinct    x.rowid)    x_cnt
,count(distinct   x1.rowid)   x1_cnt
,count(distinct   x2.rowid)   x2_cnt
,count(distinct   x3.rowid)   x3_cnt
,count(distinct  it1.rowid)  it1_cnt
,count(distinct prt1.rowid) prt1_cnt
from jrtp_rdb.jrtepartoccurrence prt
join jrtp_rdb.jnameditem it 
     on it.oid = prt.oid
join jrtp_rdb.xdistribports x 
     on x.oidorigin = prt.oid
join jrtp_rdb.xflowports x1 
     on x1.oiddestination = x.oiddestination
join jrtp_rdb.xgeneratesconnectionitems x2 
     on x2.oidorigin= x1.oidorigin
join jrtp_rdb.xownsimplieditems x3 
     on x3.oiddestination = x2.oiddestination
join jrtp_rdb.jnameditem it1 
     on it1.oid = x3.oidorigin
join jrtp_rdb.jrtepartoccurrence prt1 
     on prt1.oid = it1.oid
where prt.oid in
('00013885000000004C00426DEC534269')
group by prt.oid, it.itemname, it1.itemname, prt1.oid;

这个怎么样:

select distinct prt.oid, it.itemname, it1.itemname, prt1.oid from jrtp_rdb.jrtepartoccurrence prt
join jrtp_rdb.jnameditem it on it.oid = prt.oid
join jrtp_rdb.xdistribports x on x.oidorigin = prt.oid
join jrtp_rdb.xflowports x1 on x1.oiddestination = x.oiddestination
join jrtp_rdb.xgeneratesconnectionitems x2 on x2.oidorigin= x1.oidorigin
join jrtp_rdb.xownsimplieditems x3 on x3.oiddestination = x2.oiddestination
join jrtp_rdb.jnameditem it1 on it1.oid = x3.oidorigin
join jrtp_rdb.jrtepartoccurrence prt1 on prt1.oid = it1.oid
where prt.oid in
('00013885000000004C00426DEC534269') and prt.oid<>prt1.oid

你可以试试这个

With cte as(
select prt.oid, it.itemname, it1.itemname, prt1.oid,
RANK() OVER(
            PARTITION BY it.itemname,prt.oid
            ORDER BY it.itemname,prt.oid DESC) r
 from jrtp_rdb.jrtepartoccurrence prt
join jrtp_rdb.jnameditem it on it.oid = prt.oid
join jrtp_rdb.xdistribports x on x.oidorigin = prt.oid
join jrtp_rdb.xflowports x1 on x1.oiddestination = x.oiddestination
join jrtp_rdb.xgeneratesconnectionitems x2 on x2.oidorigin= x1.oidorigin
join jrtp_rdb.xownsimplieditems x3 on x3.oiddestination = x2.oiddestination
join jrtp_rdb.jnameditem it1 on it1.oid = x3.oidorigin
join jrtp_rdb.jrtepartoccurrence prt1 on prt1.oid = it1.oid
where prt.oid in
('00013885000000004C00426DEC534269')
)

select * from cte where r=1