【发布时间】:2018-04-13 16:52:13
【问题描述】:
我无法理解递归查询并希望有人能指出我正确的方向。
以下是一些代表网站类别结构的示例数据:
代码 标签级别 父代码 汽车摩托汽车 - 摩托 1 autokinito Car 2 自动摩托车 car-aksesouar 汽车配件 3 autokinito diakosmitika-aytokinitou 汽车装饰品 4 car-aksesouar katharistika-aytokinitou 汽车清洁剂 4 car-aksesouar keraies autokinhtou 汽车天线 4 car-aksesouar car-analosima Car Reusables 3 autokinito ladia-aytokinitou 汽车油 4 car-analosima lampes-aytokinitou 车灯 4 car-analosima我需要递归查找并为列表中的每个 Code 值查找附加到级别 1 和级别 2“祖先”的“标签”值,例如,查找代码的 parent_code,然后遍历到上面的父级, 直到您到达 1 级。例如,如果您手动查看代码“diakosmitika-aytokinitou”,“Auto - Moto”是我需要的 1 级“标签”值,“汽车”是级别2 我需要的“标签”值。
到目前为止,我想出了这个:
query3="WITH RECURSIVE parent(x) AS ("\
"SELECT 'diakosmitika-aytokinitou' "\
" UNION ALL "\
"SELECT categories.parent_code "\
"FROM categories, parent "\
"WHERE categories.code=parent.x AND categories.parent_code IS NOT NULL "\
")"\
"SELECT * FROM parent;"
这给了我这个输出作为结果集:
(u'diakosmitika-aytokinitou',)
(u'car-aksesouar',)
(u'autokinito',)
(u'auto-moto',)
(u'',)
所以,我得到了所有的祖先。我似乎无法弄清楚如何将其带到下一步并获得我想要的东西,而不是获取我的结果,然后循环使用另一个查询以找到 parent_code 为 1 和 2 的那些...希望找到一个更优雅的方式,因为我的真实数据要大得多!谢谢!
PS:使用 Python 2.7 和 sqlite3
【问题讨论】:
-
您已经正在使用另一个查询来遍历结果(在底部)。只需将级别添加到 CTE。
-
谢谢,CL。我对此进行了一段时间的研究并提出了以下代码,它只是一遍又一遍地复制了我的原始数据
query3="WITH RECURSIVE cte AS ("\ "SELECT code , parent_code, label, level FROM categories"\ " UNION ALL "\ "SELECT categories.code, categories.parent_code, categories.label, categories.level "\ "FROM categories, cte "\ "WHERE categories.code=cte.code AND categories.parent_code IS NOT NULL "\ ")"\ "SELECT * FROM cte WHERE code='diakosmitika-aytokinitou' LIMIT 100;"