SQL标准规定中null值判断是否合理?

postgres递归查询

妙音 posted @ 2014年2月11日 16:58 in 数据库 with tags postgres , 2179 阅读

示例

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中的结构,形成树状.

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter