postgres递归查询


示例

WITH RECURSIVE t AS (
    select * from danger_classify where parent_id = -1

    UNION ALL

    select dc.* from danger_classify dc, t
    where dc.parent_id = t.id
)
SELECT * FROM t;

运行过程 包含recursive的关键字,需要有union或者union all
1. 计算非递归内容,放入工作表;
2. 只要工作表不为空计算一下内容:
1) 计算递归项,用自身的递归取代工作表。去掉重复内容,之前的内容。剩下的内容进行递归,并且放入中间表
2) 用中间标内容替换工作标,并且清空中间表.

解析为树形数据

def get_tree_data():
    sql = '''
        WITH RECURSIVE t AS (
            select * from danger_classify where parent_id = -1

            UNION ALL

            select dc.* from danger_classify dc, t
            where dc.parent_id = t.id
        )
        SELECT * FROM t;
    '''
    trees = []
    temp = {}
    for row in database.db.query(sql):
        tree = {"id": int(row.id), "data": row, "children": []}
        temp[row.id] = tree["children"]
        if row.parent_id is None:
            trees.append(tree)
        else:
            temp[row.parent_id].append(tree)
    return trees

原理是借用了引用的特性。在temp中平铺所有的节点,在trees中保存结果。在temp中操作来改变trees中的结构,形成树状.



上篇: jquery对象是否相同 下篇: SQL标准规定中null值判断是否合理?