我有一个父子id表层次结构-例如。
|parent|child|
|------|-----|
| | 0|
| 0| 1|
| 0| 2|
| 0| 3|
| 1| 4|
| 1| 5|
| 2| 6|
| 4| 7|
| 4| 8|
我正在构建一个可视化树层次结构,上面的数据将被格式化为:
|parent|child1|child2|child3
|------|------|------|------
| 0| 1|4 | 7
| 0| 1|4 | 8
| 0| 1|5 |
| 0| 2|6 |
| 0| 3| |
现在我想修改这个查询,为每个父级包含一行,而不包含子级,因此上面的数据将变成:
|parent|child1|child2|child3
|------|------|------|------
| 0| | |
| 0| 1| |
| 0| 1| 4|
| 0| 1| 4| 7
| 0| 1| 4| 8
| 0| 1| 5|
| 0| 2| |
| 0| 2| 6|
| 0| 3| |
为了得到第一个结果,我正在使用重复的左连接构建数据(使用上面的第一个数据示例),因为我的理解是,我不能用递归来实现这一点,例如:
SELECT t1.child AS parent
t2.child AS child1
t3.child AS child2
t4.child AS child3
FROM id_table t1
LEFT JOIN id_table t2
ON t1.child = t2.parent
LEFT JOIN id_table t3
ON t1.child = t3.parent
LEFT JOIN id_table t4
ON t1.child = t4.parent
WHERE t1.child = '0'
这是第二个例子,但是我也缺少每个家长的记录,如第三个例子所示。
我想这可能是一个简单的问题,我只是在与语法斗争。谢谢你的帮助。
编辑:我之前有一个关于sas中类似实现的问题,例如:sql—每个级别都有记录的递归树层次结构,但是这是sas sql实现的问题,它的限制要大得多—使用该方法,我最终只能在每个级别创建临时表,然后合并最终结果,这很混乱。试图找到一个更干净的解决方案。
1条答案
按热度按时间omvjsjqw1#
group by rollup可用于创建这些额外的行:
或者使用递归查询遍历层次结构,构建路径,然后将其拆分为列:
不知道哪一个更有效率。