我正在尝试通过 Haskell 中的给定名称获取特定根的所有子项。 树的声明: 以及我尝试过的: 我想打电话给childrenOf "dir1" sample2并得到["file1", "dir3"] 但是,我收到错误消息: ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我目前正在尝试获取树的任何特定位置的所有关系和子项。 这些表如下:
TABLE ORGANISATION TABLE LINKS
| Orga_Name | Code | DELETED | | Code | Dads_Code | STT |
| DR | DR001 | FALSE |(root) | DR001 | Null | OK |(root no dad snif)
| DSI | DS001 | FALSE | | DS001 | DR001 | OK |
| DLE | DL001 | FALSE | | DL001 | DR001 | OK |
| DMP | DM001 | FALSE | | DM001 | DS001 | OK |
| TRS | TR001 | FALSE | | TR001 | DM001 | OK |
| TRE | TE001 | TRUE | | TE001 | DM001 | NOK |
| TRC | TC001 | FALSE | | TE001 | DM001 | NOK |
如果任何行具有DELETED = TRUE或STT = NOK,则根本不应该考虑它。 (就像本示例中的TRE和TRC一样)
完美的结果如下所示:
| Code | PICK-ONE| Path |
| DS001 | DR001 | DS001/DR001 |
| DL001 | DR001 | DL001/DR001 |
| DM001 | DR001 | DM001/DS001/DR001 |
| TR001 | DR001 | TR001/DM001/DS001/DR001 |
| DM001 | DS001 | DM001/DS001 |
| TR001 | DS001 | TR001/DM001/DS001 |
| TR001 | DM001 | DM001/TR001 |
因此,我可以在“ PICK-ONE”中选择一个代码,并将其所有(直接和间接)子代作为列表。 我一直在尝试使用CONNECT_BY_ROOT,这是我正在使用的当前代码:
SELECT Code,
CONNECT_BY_ROOT Code,
LEVEL-1,
SYS_CONNECT_BY_PATH(Code, '/') "Path"--,STT
FROM (
SELECT o1.*,a1.STT,o1.DELETED
FROM ORGANISATION o1
LEFT JOIN LINKS a1
ON o1.Code=a1.Code
AND DELETED = 'FALSE'
)
WHERE LEVEL > 0 AND STT like 'OK'
CONNECT BY PRIOR Code = Dads_Code;
我得到的结果大多来自他的根源,以及他的一个孩子(一直是相同的)。 在我的示例中,我得到的结果将来自DS001和DR001。 一些结果是正确的。 可悲的是,分析停止在2级最大值处 ,有一些重复项 ,也有一些通往自身结果的路径 (0级)。
我一直在尝试更改级别或路径,或更改某些条件,但找不到问题。 如果您能帮助我,我将非常高兴!
不要使用CONNECT BY
因为它在这一点上已经过时了。 在没有任何标准的日子,这是查询层次结构的好方法。
使用大多数数据库中可用的递归公用表表达式(aka递归CTE)作为SQL标准的一部分。
例如,如果要检索DR001
所有子级,则可以执行以下操作:
with n (code, dads_code, lvl, path) as (
select code, dads_code, 1, code from links where code = 'DR001'
union all
select l.code, l.dads_code, n.lvl + 1, n.path || '/' || l.code
from links l
join n on n.code = l.dads_code
where l.stt <> 'NOK'
and not exists (select 1 from organisation o
where o.code = l.code and deleted = 'TRUE')
)
select code, dads_code, lvl, path from n
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.