2011-05-14 38 views
0

我需要从三个表中选择查询来显示项目和子项目(级别上)和子子项目(级别二),我的问题是当我选择使用连接我在查询的结果中获得多于item1的情况下,如果item1有多个sub,所以我需要查询来完成这个菜单,而我们这三个表。从三个表中选择创建在asp.net中的动态菜单控制

CREATE TABLE [dbo].[Category] (

      [CategoryID] [int] PRIMARY KEY IDENTITY , 

      [CategoryName] [nvarchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 

      [Remarks] [nvarchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 

) ON [PRIMARY] 

GO 



CREATE TABLE [dbo].[CategorySub] (

      [SubCategoryID] [int] NOT NULL , 

      [CategoryIDToSub] [int] NULL , 

      [SubCategoryName] [nvarchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 

      [RcatID] [int] NULL , 

      [RsubID] [int] NULL , 

      [Rsub2ID] [int] NULL , 

      [Remarks] [nvarchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 

) ON [PRIMARY] 

GO 



CREATE TABLE [dbo].[CategorySub2] (

      [Sub2CategoryID] [int] NOT NULL , 

      [SubCategoryID] [int] NULL , 

      [Sub2CategoryName] [nvarchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 

      [RcatID] [int] NULL , 

      [RsubID] [int] NULL , 

      [Rsub2ID] [int] NULL , 

      [Remarks] [nvarchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 


) ON [PRIMARY] 

GO 

回答

2

虽然不是直接回答你的问题 - 如果你以任何方式可以,我建议改变模式。目前的一个混淆阅读所有不同的命名方案,更不用说它的硬编码&限于三个级别。更具扩展性的解决方案,提供你的SQL Server上运行2005+将是使用单一的自引用类别表,然后使用递归公用表表达式查询它:

CREATE TABLE #Category 
(
    CategoryID int PRIMARY KEY IDENTITY, 
    ParentID int NULL, 
    Name nvarchar(500), 
); 

WITH TMP AS 
(
    SELECT 
     CategoryID, 
     Name, 
     0 AS Level 
    FROM 
     #Category 
    WHERE 
     ParentID IS NULL 

    UNION ALL 

    SELECT 
     C.CategoryID, 
     C.Name, 
     Level + 1 AS Level 
    FROM 
     #Category C 
    INNER JOIN 
     TMP ON TMP.CategoryID = C.ParentID 
) 
SELECT 
    CategoryID, 
    Name 
FROM 
    TMP 

上述支持几乎无限的水平的嵌套,你会得到所有的类别与他们的ID,ParentID指示父行的ID,以及从0,1,2等等级指标

+0

问题是我是因为我在现有项目中工作,所以只限于这些表格 – 2011-05-16 16:13:16