【问题标题】:Recursive query rows to single column?递归查询行到单列?
【发布时间】:2011-05-17 04:02:40
【问题描述】:

1) 什么是递归查询? 2)它们危险吗? 3)我怎样才能进行递归查询以给我结果

ID Date
1  10/10/2010
1  20/10/2010
1  20/10/2010
2  11/10/2010
2  22/10/2010

   ID  Dates
    1  10/10/2010,20/10/2010,20/10/2010
    2  11/10/2010,22/10/2010

4) 你能解释一下递归是如何在查询中运行的吗?我用谷歌搜索但无法了解递归的实际工作方式。我的数据库是 DB2 ISeries V5R4。

【问题讨论】:

  • 您要求的是旋转,而不是递归
  • 是的,我实际上不明白他的问题。没有要求,有很多方法可以得出他的结果

标签: sql recursion db2 ibm-midrange


【解决方案1】:

递归查询是一种可以进行递归计算的 SQL 查询。也就是说,它可以使用自己的结果继续查询。这是一个抽象的描述:

1/ ancestor (x, y) = parent (x, y)

2/ ancestor (x, y) = parent (x, z) && ancestor (Z, Y).

可以简单理解为,列出 Z 的所有祖先,列出其所有父母,然后列出这些父母的所有父母......

例如,如果您有一个包含 2 列 Parent 和 Child 的 Family 表,如下所示:

pkey  char  1  not null  primary key
ckey  char  1  not null  primary key

('A','B') 
('A','C') 
('A','D')  
('C','E')  
('D','A')  
('D','E')  
('D','F')  
('F','G')

左边是父母,右边是孩子。现在你想找到 A 的所有后代,那么这里有一些代码:

with parent_ctl (ckey) as 
(
select ckey
    from parents
        where pkey='A'
UNION ALL
select c.ckey
    from parents C, parent_ctl P
        where P.ckey = C.Pkey
)
select ckey from parent_ctl; 

【讨论】:

  • 感谢小伙伴的回复。如果我想在像 'A' - 'B,C,D' 这样的单列中列出 ID 为 'A' 的记录的所有第二列值怎么办?
  • 查询的执行顺序是什么?首先是父查询,然后是 UNION all 的所有结果,这是正确的顺序吗?
  • 我会尽量给你一个总结,但这有点多。我真的没有得到第一个问题。我的查询应该做得很好,不是吗?顺序是您首先运行顶部查询以选择所有直接子级。 DB 将数据保存在某个名为 D 的地方,然后它使用 D 生成 D 的下一个直接子代,称为 E,然后合并 D 和 E。继续该过程,直到 UNION ALL 下面的查询返回空集
  • 您好,感谢您的回复,请查看我的原始帖子示例。如何使用逗号分隔值列出我的行?
  • @Pavel Urbančík:为什么不呢,(甚至是递归的)CTE 在 DB2 中受支持,不是吗?还是别的什么?
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多