我在Oracle db中有一个表,其中包含这样的数据,a + b,b + a,c + d,d + c。
我的问题是,当a + b = b + a时,如何获取不同的记录。
PK CODE
1000 87DIA4+BAJI204
1001 87DIA4+BIJI939
1002 87DIA4+C3IDI02
1003 87DIA4+C3IZI419
1004 BAJI204+87DIA4
1005 BIJI939+87DIA4
1006 C3IDI02+87DIA4
1007 C3IZI419+87DIA4
答案 0 :(得分:0)
如果我理解你的问题,你可能需要这样的东西:
with yourTable(PK, CODE) as (
select '1000', '87DIA4+BAJI204' from dual union all
select '1001', '87DIA4+BIJI939' from dual union all
select '1002', '87DIA4+C3IDI02' from dual union all
select '1003', '87DIA4+C3IZI419' from dual union all
select '1004', 'BAJI204+87DIA4' from dual union all
select '1005', 'BIJI939+87DIA4' from dual union all
select '1006', 'C3IDI02+87DIA4' from dual union all
select '1007', 'C3IZI419+87DIA4' from dual
)
select least( substr(code, 1, instr(code, '+') -1), substr(code, instr(code, '+') +1)) as A,
greatest( substr(code, 1, instr(code, '+') -1), substr(code, instr(code, '+') +1)) as B
from yourTable
group by least( substr(code, 1, instr(code, '+') -1), substr(code, instr(code, '+') +1)),
greatest( substr(code, 1, instr(code, '+') -1), substr(code, instr(code, '+') +1))
给出:
A B
--------------- ---------------
87DIA4 BAJI204
87DIA4 BIJI939
87DIA4 C3IDI02
87DIA4 C3IZI419
我们的想法是分离每一行中的值,并为每一行评估“最小”和“最大”值。这样,如果您有A + B和B + A,您可以使用这些结果进行分组并只获得一行A + B.
答案 1 :(得分:0)
编写一个子查询,将CODE
列中的两个元素分开。然后使用自联接来查找互惠对:
SQL> with cte as ( select pk
2 , substr(code, 1, instr(code, '+')-1) as str1
3 , substr(code, instr(code, '+')+1) as str2
4 from your_table)
5 select a.pk as a_pk
6 , b.pk as b_pk
7 , a.str1
8 , a.str2
9 from cte a
10 join cte b
11 on a.str1 = b.str2
12 and a.str2 = b.str1
13 where a.pk < b.pk
14 order by a_pk;
A_PK B_PK STR1 STR2
---------- ---------- ------------ ------------
1000 1004 87DIA4 BAJI204
1001 1005 87DIA4 BIJI939
1002 1006 87DIA4 C3IDI02
1003 1007 87DIA4 C3IZI419
4 rows selected.
SQL>
WHERE子句确保结果集只包含每个互惠对的一个实例。
答案 2 :(得分:0)
正如Aleksej和APC都指出的那样,您需要将code
拆分为组件。我很高兴看到他们都提供了#34;对#34;解决方案(而不是&#34;懒惰&#34;解决方案) - 要拆分code
,使用标准字符串函数substr()
和instr()
,而不是正则表达式。
下面的解决方案也会以同样的方式拆分code
。我将其用于GROUP BY
子句,将您考虑的行组合在一起&#34;复制&#34;。然后从每个组中选择具有最低PK
值的那个。 注意:您的问题陈述不完整,您没有说明应该从每对中保留哪一行。 (或者,更一般地说,如何处理它们......如果要求不同,可以调整下面的解决方案。)
在每个组中,我选择MIN(PK)
- 这是不言自明的。然后,要获取属于CODE
的{{1}}值,我使用PK
函数;如果您不熟悉,请参阅文档。 (有些开发商不是。)
此解决方案只读取一次基础数据,并且没有连接。
FIRST