【问题标题】:Retrieve field offset via recursive query in db2通过 db2 中的递归查询检索字段偏移量
【发布时间】:2019-10-30 23:59:38
【问题描述】:

假设我有 field_name-field_len 对的键值表。

如下:

-----------------------------------
field_name       |    field_len   |
-----------------------------------
FIELD_A          |    10          |
-----------------------------------
FIELD_B          |    20          |
-----------------------------------
...
-----------------------------------
FIELD_X          |    2           |
-----------------------------------
FIELD_Y          |    100         |
-----------------------------------

然后我需要将每个字段的偏移量放在第三列中。 像这样:

-----------------------------------------------------
field_name       |    field_len   |      offset     |
-----------------------------------------------------
FIELD_A          |    10          |         0       |
-----------------------------------------------------
FIELD_B          |    20          |        10       |
-----------------------------------------------------
...
-----------------------------------------------------
FIELD_X          |    2           |       250       |
-----------------------------------------------------
FIELD_Y          |    100         |       252       |
-----------------------------------------------------

所以我根据一些手册(1,2)编写了这个脚本:

with offsets (column_name, length, offset) as
 ((select column_name, length, CAST(0 AS SMALLINT)
     from myschema.sizes a
     start with rrn(a) = 1)
  union all
  (select b.column_name, b.length, offset + o.length
  from offsets o, myschema.sizes b
    where rrn(b) between 2 and 100))
select * from offsets;

但是,它不断进入无限循环。

这个版本也给出了相同的结果:

with offsets (column_name, length, offset) as
 ((select column_name, length, CAST(0 AS SMALLINT)
     from myschema.sizes a
     fetch first row only)
  union all
  (select b.column_name, b.length, offset + o.length
  from offsets o join myschema.sizes b on b.column_name = o.column_name
    where o.column_name <>'LAST_FIELD'))
select * from offsets;

我猜,这在退出条件的某个地方搞砸了,但无法确定修复它的确切位置。

最好避免任何特定于表的元数据,如行数。

【问题讨论】:

    标签: sql recursion db2


    【解决方案1】:

    您不需要递归 CTE。只是一个累积的总和。像这样的:

    select s.*,
           (sum(field_len) over (order by rrn(s)) - field_len) as offset
    from myschema.sizes s;
    

    我不确定排序是如何定义的。好像是基于一个函数rrn()

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多