-2

我对基于递归子句的查询有疑问:

我有两个表:menu(菜单类别)和 menu_items(这些类别中的项目)。这些表是连接的:每个类别都可以有一些项目。现场查看菜单的顺序基于列:“menuitem_next”。连接列是 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”列正确排序。谁能帮我修改这个查询或写新的?

我很抱歉我的英语不好。

问候

4

1 回答 1

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它的字段。也许您打算按特定领域订购?

您没有在SELECTs 中指定字段列表,因此我实际上无法分辨这些字段是什么。这不是很好的做法,因为如果您稍后将列添加到表中,它会导致意外结果;您应该始终明确列出列而不是编写SELECT *.

于 2013-07-02T08:16:24.920 回答