2011-05-14 34 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