我的查询有问题,基于递归子句:
我有两个表:菜单(菜单类别)和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'列正确排序。任何人都可以帮我修改这个查询或者写新的吗?
我很抱歉我的英语不好。
此致
答案 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 *
。