Oracle SQL:使用存储过程获取由逗号分隔的id字段连接的数据

时间:2015-11-04 18:24:52

标签: sql oracle

过去两周我一直受到这个问题的折磨,不能再花上这么多时间了。如果你有一分钟​​,我很想听听这个社区的任何想法。我是自学成才,所以我必须用非专业的术语来解释这一点。谢谢你的考虑。

我的目标是获取非零余额的所有发票。这对于常规发票来说非常简单。问题出现在付款提醒中,因为他们的余额只是滞纳金,所以为了获取总余额,我必须通过连接表COLLECTIVEINVOICENO中的单个字段链接回原始发票。

INVOICE的示例:

invoiceid     | invoiceno     | invoicetypename     | amount
--------------|---------------|---------------------|--------------------
10008         | 123000        | Payment Reminder    | 5
10005         | 113000        | Payment Reminder    | 5
10001         | 110000        | Invoice             | 35

COLLECTIVEINVOICENO10001过期的表格10005的示例:

invoiceid     | followed_up_in (CHAR)
--------------|----------------------------------------------------------
10005         | 113000, 123000
10001         | 113000

我找到了一个非常糟糕的解决方案,它可以同时获取单个客户的分类帐,但是对资源要求很高,我无法在整个表INVOICE上使用它:

select (
  select sum(i.amount) as sum
  from INVOICE i0
  join COLLECTIVEINVOICENO cin0 on cin0.invoiceid = i0.invoiceid
  where instr(cin0.followed_up_in, i.invoiceno) > 0
  ) as original_sum
from INVOICE i

此全表扫描在我的主select中重复五次,以便将各种余额分类到不同的列中,并从原始发票中获取除其余额之外的其他数据,例如其位置等。

我的初衷是将子选项左键加入INVOICE i作为视图,但Oracle在i.invoice中无法识别instr(cin0.collectiveinvoiceno, i.invoice)(ORA-00904:&# 34;我"。" INVOICENO":无效的标识符。)

我现在只能查看我目前正在做的游标等,但我真的想知道是否有任何关于它的SQL,非PL方式?

谢谢。

编辑:关于将逗号分隔的数据拆分为行,即。改变数据模型以促进关系:这肯定有助于我确定,但数据模型与第三方软件打包在一起,所以我无法做任何事情。 (如果他们确实在某些时候改变它,我不会感到惊讶,因为它表明最终用户是一个主要的弱点。)

编辑2:尝试使用带有regexp_substr()level的{​​{1}}将逗号分隔数据拆分为行,并将此视图加入主表。我没有解决这个问题,因为当connect by加入其他表时,regexp_substr()资源非常昂贵,而且查询在半小时后也无法提供。 Google透露这是正则表达式的常见问题,建议尝试使用存储过程。

我已经更改了标题以反映这一点,我将对如何使用存储过程解决此问题的任何输入表示感谢。无论如何,谢谢!

1 个答案:

答案 0 :(得分:1)

这可能会有所帮助。在使用主表格之前,它会使用followed_up_in拆分以逗号分隔的xmltable并将结果列表值展平为发票编号行。

      select i0.invoiceid, sum(i0.amount)
      from INVOICE i0
      left outer join 
      ( select  invoice_id, trim(COLUMN_VALUE) invoiceno
            FROM COLLECTIVEINVOICENO, 
              xmltable(('"' || REPLACE(followed_up_in, ',', '","') || '"'))
      ) cin0
      on cin0.invoiceno = i0.invoiceno
         and i0.invoiceid = cin0.invoiceid
      group by i0.invoiceid