【发布时间】:2018-08-14 19:33:35
【问题描述】:
我正在使用 DB2 V7r1(不幸的是没有 listagg)。我需要能够将项目(ItemNum)的所有描述放在一个字符串中,以逗号分隔。我有一个查询,我发现这种方法有效,但我无法按项目编号过滤结果。它可以很好地处理前 100 行数据,但如果我尝试过滤掉表中可能有 100,000 行的项目,则需要很长时间。
*编辑,我应该补充一点,这个表包含 1,460,072 条记录,一个项目/操作可能有多达 60 个描述条目,所以如果有人知道一种方法可以预先过滤结果或更有效的方法这样做我将不胜感激
这是我的桌子:PARTS
ItemNum OpSequence DscNum Description
A-123 10 2 Desc Line 1
A-123 10 4 Desc Line 2
A-123 10 6 Desc Line 3
A-123 20 2 Desc Line 1
A-123 20 4 Desc Line 2
Z-555 10 2 Desc Line 1
Z-555 10 4 Desc Line 2
这是我需要的结果(需要按ItemNum和OpSequence过滤)
ItemNum OpSequence Description
A-123 10 Desc Line 1, Desc Line 2, Desc Line 3
这是我使用的查询
with x (ItemNum, OpSequence, cnt, list, empno, len) as
(select z.ItemNum, z.OpSequence,
(select count(*) from PARTS y
where y.ItemNum=z.ItemNum
group by y.ItemNum),
cast(z.Description as varchar(100)),
rrn(z), 1
from PARTS z
where z.ItemNum = 'A-123' (HERE IS WHERE I AM TRYING TO FILTER)
union all
select x.ItemNum,
x.OpSequence,
x.cnt,
strip(x.list) ||', '|| e.Description,
rrn(e),
x.len+1
from PARTS e, x
where e.ItemNum = x.ItemNum and rrn(e) > x.empno
)
select ItemNum,OpSequence, list
from x
where len=cnt
【问题讨论】:
-
解释计划是什么样的。过滤器是否在第二个 UNION ALL 分支上重复?如果没有,您可以将其添加到您的代码中(使用第二个 CTE)吗? DscNum 的最大值是多少?如果合理,就
MAX()一堆CASE语句 -
DscNum 字段没有最大值。它只是描述字段的序列号。我不明白你所说的解释计划的意思
标签: sql concatenation ibm-midrange db2-400