从交叉引用表中获取唯一的行,其中所有项目相互引用

时间:2019-05-17 16:57:24

标签: sql oracle

我有一个零件编号(PN)的对照表。有2列,PN和ALT_PN。所有零件编号相互参照。

我需要创建一个仅显示此表中唯一值的报告。例如,仅显示A具有B的替代项,而不显示B是A的替代项。

我找到了适用于Mysql的解决方案,但是它们在Oracle 11g中不起作用。

Create table temp ( id integer primary key, PN varchar(10), Alt_PN 
varchar(10));

insert into temp values(1,'A','B');
insert into temp values(2,'B','A');
insert into temp values(3,'X','Y');
insert into temp values(4,'Y','X');
insert into temp values(5,'C','D');
insert into temp values(6,'C','E');
insert into temp values(7,'D','C');
insert into temp values(8,'D','E');
insert into temp values(9,'E','C');
insert into temp values(10,'E','D');

我只想返回ID 1、3、5、6和8

1 个答案:

答案 0 :(得分:0)

如果彼此交叉引用,请执行以下操作:

select t.*
from temp t
where t.pn < t.alt_pn;

这将返回每对中的一行,并且适用于任何类型。

如果您担心不是所有的配对都存在,则可以执行以下操作:

select t.*
from (select t.*,
             row_number() over (partition by least(t.pn, t.alt_pn), least(t.pn, t.alt_pn) order by t.pn) as seqnum
      from t
     ) t
where seqnum = 1;