sql-获取互惠数据

时间:2017-06-09 06:46:30

标签: sql oracle

我在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

3 个答案:

答案 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