【发布时间】:2010-10-20 08:29:03
【问题描述】:
我有一个使用邻接列表模型存储层次信息的表。 (使用自引用键 - 下面的示例。此表可能看起来像 familiar):
category_id name parent
----------- -------------------- -----------
1 ELECTRONICS NULL
2 TELEVISIONS 1
3 TUBE 2
4 LCD 2
5 PLASMA 2
6 PORTABLE ELECTRONICS 1
7 MP3 PLAYERS 6
8 FLASH 7
9 CD PLAYERS 6
10 2 WAY RADIOS 6
将上述数据“扁平化”成这样的最佳方法是什么?
category_id lvl1 lvl2 lvl3 lvl4
----------- ----------- ----------- ----------- -----------
1 1 NULL NULL NULL
2 1 2 NULL NULL
6 1 6 NULL NULL
3 1 2 3 NULL
4 1 2 4 NULL
5 1 2 5 NULL
7 1 6 7 NULL
9 1 6 9 NULL
10 1 6 10 NULL
8 1 6 7 8
每一行都是通过层次结构的一个“路径”,除了每个节点(不仅仅是每个叶节点)都有一行。 category_id 列代表当前节点,“lvl”列是它的祖先。当前节点的值也必须在最右边的 lvl 列中。 lvl1 列中的值将始终表示根节点,lvl2 中的值将始终表示 lvl1 的直接后代,依此类推。
如果可能,生成此输出的方法应使用 SQL,并且适用于 n 层层次结构。
【问题讨论】:
-
对于 n 层层次结构:是否提前知道 n?
-
没有。我希望解决方案足够通用以适用于任何层次结构。但是 - 如果 'n' 已知,是否有更优雅的解决方案?
标签: sql hierarchy adjacency-list flatten