Postgresql递归CTE结果排序

时间:2015-05-19 21:12:17

标签: postgresql recursion common-table-expression

我正在处理查询以从层次结构中提取数据

e.g。

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs, ys, zs)

它按预期工作。

static PyObject *
range_richcompare(PyObject *self, PyObject *other, int op)
{
    int result;
    if (!PyRange_Check(other))
        Py_RETURN_NOTIMPLEMENTED;
    switch (op) {
    case Py_NE:
    case Py_EQ:
        result = range_equals((rangeobject*)self, (rangeobject*)other);
        if (result == -1)
            return NULL;
        if (op == Py_NE)
            result = !result;
        if (result)
            Py_RETURN_TRUE;
        else
            Py_RETURN_FALSE;
    case Py_LE:
    case Py_GE:
    case Py_LT:
    case Py_GT:
        Py_RETURN_NOTIMPLEMENTED;
    default:
        PyErr_BadArgument();
        return NULL;
    }
}

它也按照我期望的顺序返回数据,而且由于结果的发现方式,它会这样做。

问题是,我可以依靠这样的顺序吗?

1 个答案:

答案 0 :(得分:2)

是的,有定义的订单。在Postgres WITH doc中,他们给出了以下示例:

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
        SELECT g.id, g.link, g.data, 1,
          ARRAY[ROW(g.f1, g.f2)],
          false
        FROM graph g
      UNION ALL
        SELECT g.id, g.link, g.data, sg.depth + 1,
          path || ROW(g.f1, g.f2),
          ROW(g.f1, g.f2) = ANY(path)
        FROM graph g, search_graph sg
        WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;

关于他们在提示框中的说法(格式化我的):

  

递归查询评估算法生成其输出   广度优先搜索顺序。您可以在深度优先中显示结果   通过使外部查询ORDER BY成为“路径”列来搜索顺序   以这种方式构建。

根据INSERT语句,您似乎在上面的案例中获得广度优先输出,所以我想如果您愿意,可以修改您的外部{{ 1}}以另一种方式订购。

我相信你案例中深度优先的模拟可能是这样的:

SELECT

正如我所期望的那样(在我脑子里经历的事情)产生这个:

WITH RECURSIVE parent_org (id, parent_id, name) AS (
  SELECT id, parent_id, name
  FROM org
  WHERE id = 3
UNION ALL
    SELECT o.id, o.parent_id, o.name
    FROM   org o, parent_org po
    WHERE  po.parent_id = o.id)
SELECT id, parent_id, name
FROM parent_org
ORDER BY id;