2012-04-18 50 views
0

我正在一个网站上的页面与父子关系安排在一个表中。页面深度可以达到任何级别,我想根据数据库为网站生成BreadCrumb。示例数据和数据字段如下图所示。网站导航/面包屑使用ASP.Net Web窗体和C#

基本表结构是像 表名Web_Pages

表列 (PAGEID INT,页面名称VARCHAR,则PageInternalLinkURL VARCHAR,则PageInheritance INT)表中的示例数据的

Example of Table Data

页面上的面包屑的示例 Example of BreadCrumb on Page

我希望网站导航的面包屑类似于下面的示例图片中显示的内容。

我试了几个礼拜,但没能把它弄清楚。

我想与出站点地图使用它,而我想语法创建和页面名称场与正确的页面URL链接。

我想要做到这一点,以便有时将页面添加到CMS面包屑是动态创建的,可以与任何页面深度一起使用。

我与CTE查询工作不正常。如果有人解决这个问题,或者可以指出一个类似于我的完整工作示例,我将不胜感激。

测试CTE不工作

SELECT * FROM pg_Pages; 
WITH RecursiveTable (PageId, PageInheritance, Level) 
AS 
(
    --Anchor 
    SELECT  tt.PageId, tt.PageInheritance, 0 AS Level 
    FROM pg_Pages AS tt 
    WHERE PageInheritance = 0 
    UNION ALL 
    --Recursive member definition 
    SELECT tt.PageId, tt.PageInheritance, LEVEL + 1 
    FROM pg_Pages AS PageId 
     INNER JOIN RecursiveTable rt ON 
     tt.PageInheritance = rt.PageId 
) 
SELECT * 
FROM RecursiveTable 
+0

你可以张贴到目前为止你已经尝试过的一个例子吗? – 2012-04-18 08:02:56

+0

现在我正在尝试使用CTE创建PageName和Page URl,如果它能工作,我只是测试它,然后我可以循环访问数据集并实用地创建列表(ul)的面包屑。 – Learning 2012-04-18 08:09:40

+0

我想要一个查询,它可以通过数据库循环,并根据页面传递给它的页面进行循环,我将传递给查询。简单的sql查询或者获取所有数据,但不能以分层的方式 – Learning 2012-04-18 08:12:42

回答

2

它看起来像你的CTE是错的 - 你几乎没有,但递归成员定义位看起来是错误的。

尝试:

SELECT * FROM pg_Pages; 
WITH RecursiveTable (PageId, PageInheritance, Level) 
AS 
(
    --Anchor 
    SELECT  tt.PageId, tt.PageInheritance, 0 AS Level 
    FROM pg_Pages AS tt 
    WHERE PageInheritance = 0 
    UNION ALL 
    --Recursive member definition 
    SELECT tt.PageId, tt.PageInheritance, Level + 1 
    FROM pg_Pages AS tt 
     INNER JOIN RecursiveTable rt ON 
     tt.PageInheritance = rt.PageId 
) 
SELECT * 
FROM RecursiveTable 
--SELECT * FROM RecursiveTable WHERE Level = 0 

在原来的尝试,你的pg_Pages别名需要是TT(你需要前缀TT PageInheritance太)。

否则,它看起来很好。

编辑

为了您更多的问题,你可以添加额外的列:

SELECT * FROM pg_Pages; 
WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level) 
AS 
(
    --Anchor 
    SELECT  tt.PageId, tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, 0 AS Level 
    FROM pg_Pages AS tt 
    WHERE PageInheritance = 0 
    UNION ALL 
    --Recursive member definition 
    SELECT tt.PageId, tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1 
    FROM pg_Pages AS tt 
     INNER JOIN RecursiveTable rt ON 
     tt.PageInheritance = rt.PageId 
) 
SELECT * 
FROM RecursiveTable 
--SELECT * FROM RecursiveTable WHERE Level = 0 

进一步编辑:

好吧,做你想做什么,你可以把查询各地;只要你知道的页面ID:

DECLARE @PageId int 
SET @PageId = 39; 
WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level) 
AS(
    --Anchor 
    SELECT  tt.PageId, tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, 0 AS Level 
    FROM TestPage AS tt 
    WHERE PageId = @PageId 
    UNION ALL 
    --Recursion 
    SELECT tt.PageId, tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1 
    FROM TestPage AS tt 
    INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId 
) 
SELECT * FROM RecursiveTable ORDER BY Level DESC 

我们在这里做的是在你的页面开始,然后通过该表向后工作,寻找所有的父母。在这种情况下,最高级别的记录是最终的父级,所以我们按降序排列以反映这一点。

+0

我注意到,即使以前,但它没有工作或者但你的查询工作 – Learning 2012-04-18 08:24:09

+0

我该如何改变这个显示我的PageName,PageId,PageInternalLinkURL和PageInheritance。我会很感激你的帮助,同时我也会尝试。因为我还没有在过去的CTE查询工作 – Learning 2012-04-18 08:25:51

+0

这个节目结果之一与表和所有tee数据与CTE查询中提到的字段 – Learning 2012-04-18 08:28:51

0

假设您想要检索PAGEID 39面包屑,你可能想尝试这样的事:

declare @pageId int 

set @pageId=39; 
WITH RecursiveTable (PageId,PageName, PageInheritance,PageInternalLinkURL, Level) 
AS 
(
    --Anchor 
    SELECT  tt.PageId,tt.PageName, tt.PageInheritance,tt.PageInternalLinkURL, 0 AS Level 
    FROM pg_pages AS tt 
    WHERE PageID = @pageId 
    UNION ALL 
    --Recursive member definition 
    SELECT tt.PageId,tt.PageName, tt.PageInheritance,tt.PageInternalLinkURL, Level + 1 
    FROM pg_pages AS tt 
     INNER JOIN RecursiveTable rt ON 
     rt.PageInheritance = tt.PageId 
) 
SELECT * 
FROM RecursiveTable