【问题标题】:Nested Category table with Category and SubCategory包含 Category 和 SubCategory 的嵌套 Category 表
【发布时间】:2012-05-07 12:33:41
【问题描述】:

各位,
我有一个包含 CategoryID(主键)、ParentID(int 非空)和 Category(nvarchar 非空)的 Category 表。
我正在尝试在此表中插入和检索 ID 为 CategoryID 的类别和 ID 为 ParentID 的子类别。
我一直在尝试整个周末都没有运气,希望你能帮助我。我正在使用 MSSQL 2008。
表结构应如下所示:

-Category1          
        SubCategory1  
        SubCategory2  
    ...  

-Category2  
            SubCategory2  
            SubCategory2  
    ...  

任何帮助将不胜感激

【问题讨论】:

  • 从您的 cmets 看来,在我看来问题更多在于 UI 控制端(例如 GridView),如何在 gridview 行插入上更新您的数据,而不是在数据库端。如果是这种情况,我认为您应该在您的问题中澄清这一点,如果这是一个特定于技术的问题(例如 WPF、ASP .NET、Windows 窗体等)。对了,你见过RowCommand Event的例子吗?
  • 谢谢阿道夫。我研究了 rowcommand 事件并认为它会有所帮助。我试试看。
  • 谢谢大家,我想我在这里找到了我想要的东西:sqllessons.com/categories.html

标签: c# .net sql gridview nested-datalist


【解决方案1】:

检查公用表表达式,这些表达式允许您创建“递归选择”。 http://www.mssqltips.com/sqlservertip/1520/recursive-queries-using-common-table-expressions-cte-in-sql-server/

【讨论】:

  • 谢谢,但是这篇文章没有给我我需要的东西。该场景是一个简单的数据库插入(工作正常),然后显示类别的结果(工作正常)。现在如何选择一个类别(CategoryID)并在下面插入一个子类别(ID为ParentID)。我使用 Gridview 来显示结果。
  • 谢谢马丁,我想我在这里找到了我要找的东西:sqllessons.com/categories.html
【解决方案2】:

您可以使用递归公用表表达式:

WITH cteTable(madeUpColA, madeUpColB, Etc) as
(
   -- this select statement with the union all is what does the recursive query
   SELECT aCol as madeUpColA, bCol as madeUpColB, Etc
   from dbo.someTable
   UNION ALL
   SELECT aCol as madeUpColA, bCol as madeUpColB, Etc
   FROM dbo.someTable st
   INNER JOIN cteTable as c -- inner join on relationship
   ON st.aCol = c.madeUpColA
)
-- this select statement is what retrieves the data from the above query
SELECT madeUpColA, madeUpColB, Etc
FROM cteTable
-- add your other criteria here

您可以将MSDN documentation 用于WITH 语句来专门化您的查询

【讨论】:

  • 感谢您的回复。但我认为它不应该那么复杂。我希望我知道一种从网格视图或数据列表中选择插入类别的方法,并根据该类别的 ID 在类别表中插入一个子类别。我确信魔法应该发生在 gridview 的 rowcommand 上,但我不知道如何捕捉它:(
  • 谢谢查尔斯,我想我在这里找到了我要找的东西:sqllessons.com/categories.html
  • 我发布的 with 声明使您不必担心子类别的深度。例如,您发布的页面使用 3 个连接语句来获得 4 个子类别的深度。上面的 with 语句不关心深度是 1 还是 many 它仍然会返回所有结果
  • 我无法理解您的 with 语句,因为我对 sql 的了解处于初级水平。我可以看到页面上的那个是有限的,需要做相应的调整。如果她有任何问题,请纠正我: WITH cteTable(ColumnA, ColumnB, Etc) as ( SELECT aCol as ColumnA, bCol as ColumnB, Etc from dbo.someTable UNION ALL SELECT aCol as ColumnA, bCol as ColumnB, Etc FROM dbo.someTable st INNER JOIN cteTable as c ON st.aCol = c.ColumnA)
【解决方案3】:

您只是在寻找一个简单的自我加入吗?如果是这样,这应该工作:

select parent.category, subcat.category as subcategory
from Category subcat join
     Category parent
     on subscat.parentid = parent.categoryid

还是需要遍历整个父链?如果是这样,那么递归 CTE 是更好的方法。

【讨论】:

  • 抱歉反馈迟了。我不明白您的查询,但是是的,它应该是一个简单的联合。它只涉及表 tblCategory:CategoryID [int] Primary key, ParentID[int] NOT NULL, Category [nvarchar](255) NOT NULL。
  • 谢谢 Gordon,我想我在这里找到了我想要的东西:sqllessons.com/categories.html
猜你喜欢
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2017-06-07
相关资源
最近更新 更多