在Postgres上加入高级递归查询中的'order by'

时间:2013-07-01 17:22:16

标签: postgresql recursion

我的查询有问题,基于递归子句:

我有两个表:菜单(菜单类别)和menu_items(这些类别中的项目)。这些表是连接的:每个类别都可以包含一些项目。现场菜单中的订单基于列:'menuitem_next'。 join列是menuitem_parent。现在,我想查看菜单,所以我使用查询:

select * from menu m left join 
    (With RECURSIVE submenu AS 
        (Select * from menu_item where menuitem_name not in 
            (select menuitem_next from menu_item where menuitem_next is not null) 
        Union all 
            SELECT mi.* FROM menu_item AS mi JOIN submenu AS sm ON 
                (mi.menuitem_name=sm.menuitem_next)
        ) 
        SELECT * FROM submenu 
     )r 
on m.menu_id=r.menuitem_parent order by m, r

结果查询中的顺序不正确。类别按ID排序,菜单项使用'menuitem_next'列正确排序。任何人都可以帮我修改这个查询或者写新的吗?

我很抱歉我的英语不好。

此致

1 个答案:

答案 0 :(得分:1)

除非外部查询中有ORDER BY,否则没有为查询定义特定排序。

您的查询构造非常奇怪,因此我对其进行了重组以使CTE保持为外部查询:

WITH RECURSIVE 
submenu AS (
    SELECT * from menu_item 
    WHERE menuitem_name NOT IN (
        SELECT menuitem_next
        FROM menu_item 
        WHERE menuitem_next IS NOT NULL
    ) 
    UNION ALL
     SELECT mi.* FROM menu_item AS mi 
     INNER JOIN submenu AS sm
     ON (mi.menuitem_name=sm.menuitem_next)
)
SELECT * 
FROM menu m
LEFT OUTER JOIN submenu sm
ON m.menu_id = sm.menuitem_parent
ORDER BY m, sm;

此时很明显,ORDER BY子句位于submenu整个元组上,而不是来自它的字段。也许你打算按特定领域订购?

您没有在SELECT中指定字段列表,因此我无法实际告知字段是什么。这不是一个很好的做法,因为如果稍后向表中添加列,它会导致意外的结果;你应该总是明确地列出列而不是写SELECT *