我有一个内容管理系统,其中包含类别的层次结构,子类别在每个级别都有不同的排序选项。目前,这是通过(相当大的)一系列查询检索的......但我试图通过使用递归存储过程加快速度。
(据我所知,使用CTE会是最好的。但是我不确定如果排序因级别而异,有一种方法可以做到这一点。如果我错了,请纠正我。)
所以,我已经完成了所有工作...除了我无法弄清楚如何遍历记录来查询我找到的每个类别的孩子。我已经尝试过使用游标,但是,再次看来,订购似乎是一个问题。 (再次,如果我错了,请纠正我。)
这是代码(从创建临时表的父过程调用):
BEGIN
SET NOCOUNT ON;
DECLARE @parent_new int, @custom_order_new varchar(1);
DECLARE @title varchar(255), @is_nav_hidden bit, @display int;
-- store the information about this category into the temp table
IF @parent > 0
BEGIN
INSERT INTO #CategoryListTemp SELECT DISTINCT c.id, c2c.id_parent, c.title, cp.id, c.page_order, null, c.is_published, cu.is_album, u.firstname, u.lastname, c.is_nav_hidden from categories_categories c2c, categories c LEFT JOIN categories_users cu ON c.id=cu.id_category LEFT JOIN users u ON cu.id_user=u.id LEFT JOIN categories_pages cp ON c.id=cp.id_category AND cp.id_page=@id where c2c.id_category=c.id and c.id=@parent;
END
-- and then find out about its children
IF @custom_order='c' BEGIN
SELECT DISTINCT @parent_new = c.id, @custom_order_new = c.page_order, @title=c.title, @is_nav_hidden=c.is_nav_hidden from categories_categories c2c, categories c where c2c.id_category=c.id and c2c.id_parent=@parent order by c.is_nav_hidden, c.title;
END
ELSE
BEGIN
SELECT DISTINCT @parent_new = c.id, @custom_order_new = c.page_order, @is_nav_hidden=c.is_nav_hidden, @display=c2c.display, @title=c.title from categories_categories c2c, categories c where c2c.id_category=c.id and c2c.id_parent=@parent order by c.is_nav_hidden, c2c.display, c.title;
END
if @parent_new IS NOT NULL BEGIN
EXEC GetCategoryListData @id, @parent_new, @custom_order_new
END
END
任何指针都会非常感激地收到。非常感谢。
答案 0 :(得分:1)
我刚刚开始使用StackOverflow并寻找要回答的问题。你的看起来很有趣,但实际创建开发和测试答案所需的样本记录需要做很多工作。
建议 - 使用以下链接(如何在论坛上发布数据/代码以获得最佳帮助)。
http://www.sqlservercentral.com/articles/Best+Practices/61537/
它将为您提供有关创建示例数据脚本的提示,以使您的问题易于复制,希望能够解决。
西尔维亚
答案 1 :(得分:0)
如果我理解你的问题,你需要递归CTE来完成你的任务。看看这个 Common Table Expressions (CTE) in SQL Server 2005 。这里有一个更简化的例子SQL SERVER – Simple Example of Recursive CTE