【问题标题】:How to show hierarchial data in a dropdownlist如何在下拉列表中显示分层数据
【发布时间】:2010-03-21 21:50:45
【问题描述】:

我在 SQL Server 2005 中有一个表。

alt text http://www.techpint.com/sites/default/files/images/table.JPG

我想在保持相同层次结构的下拉列表中显示所有域名。即

法律
工程
--民用
--机械
医疗
--牙科
----型腔
--MBBS

我需要根据域级别附加'--'。是否可以使用 sql 查询。 或者我可以有任何其他控件来显示这些数据。

【问题讨论】:

    标签: .net asp.net sql sql-server


    【解决方案1】:

    在 SQL Server 2005 及更高版本中,您可以使用递归 CTE(基于 this article 的示例):

    DECLARE @t AS TABLE (domainid INT NOT NULL, domainname VARCHAR(25) NOT NULL, parentdomainid INT NULL);
    INSERT INTO @t VALUES (1, 'Law', NULL);
    INSERT INTO @t VALUES (3, 'Engineering', NULL);
    INSERT INTO @t VALUES (4, 'Medical', NULL);
    INSERT INTO @t VALUES (6, 'Civil', 3);
    INSERT INTO @t VALUES (7, 'Mechanical', 3);
    INSERT INTO @t VALUES (8, 'Dental', 4);
    INSERT INTO @t VALUES (9, 'MBBS', 4);
    INSERT INTO @t VALUES (12, 'Cavity', 8);
    
    -- SELECT * FROM @t;
    
    WITH CTE(domainid, parentdomainid, domainname, Depth, SortCol)
                AS
                (
                  SELECT domainid, parentdomainid, domainname, 0, CAST(domainid AS varbinary(max))
                  FROM @t
                  WHERE parentdomainid IS NULL
                  UNION ALL
                  SELECT d.domainid, d.parentdomainid, d.domainname, p.Depth + 1,
                            CAST(SortCol + CAST(d.domainid AS binary(4)) AS varbinary(max))
                  FROM @t AS d
                            JOIN CTE AS p
                              ON d.parentdomainid = p.domainid
                )
                SELECT domainid, parentdomainid, domainname, Depth, REPLICATE('--', Depth) + domainname as displayname
                FROM CTE
                ORDER BY SortCol;
    

    【讨论】:

    • @Cade Roux:感谢您的询问,请问SortCol在这里的作用是什么。
    • @vaibhav 看看没有 ORDER BY 的情况。如果没有 ORDER BY,则无法保证您有任何特定的订单。如果将 SortCol 添加到 SELECT 中,您可以看到它在做什么。它只是使用固定宽度的十六进制表示来使排序正确。如果您根本不填充连接的数字(例如,以十进制形式,使用简单的连接),1,21 将是 121,12,1 将是 121,不用说,排序会一团糟。
    【解决方案2】:

    1) 你需要编写一个查询来选择所有节点及其级别(名称,级别) 2)将级别转换为数字'-'并与名称字符串连接

    选择 DomainID、Level 的查询(我知道 WITH)

    CREATE PROCEDURE [GetDomainTree]
    (
    @topDomainID int
    ) with encryption
    AS
    BEGIN
    DECLARE @level int
    DECLARE @count int
    
    DECLARE @tempTable TABLE (DomainID int, [Level] int)
    
    INSERT INTO @tempTable
    (DomainID, [Level])
    VALUES
    (@topDomainID, 0)
    SET @count = 1
    SET @level = 0
    WHILE @count > 0
     BEGIN
      INSERT INTO @tempTable
      (DomainID, [Level] )
      (
       SELECT DomainsRealTable.DomainID,
           @level + 1,
         @topDomainID
       FROM  @tempTable domains, DomainsRealTable
       WHERE domains.[Level] = @level
          AND DomainsRealTable.ParentDomainID = domains.DomainID
      )
      SELECT @count = COUNT(*)
      FROM   @tempTable
      WHERE  [Level] = @level + 1
      SET @level = @level + 1
     END
    SELECT *
    FROM   @tempTable
    ORDER BY [Level]
    END
    

    现在,您可以编写一个 sql 函数,该函数将采用 int 参数(级别)并返回 nvarchar '-'*Level 并结合两个查询以获得您想要的结果

    【讨论】:

    • @Nagg:什么是水平?你能写一个查询吗?
    • 进行查询,但可能包含一些错误:)
    【解决方案3】:

    你也可以写成代码

    伪代码,你懂的

    函数 createlist(parent_id, 缩进) { 如果 parent_id 为空 { 从 parent 为 null 的表中选择 children_name、children_id } 别的 { 缩进+=“--”; 从 parent = parent_id 的表中选择 children_name、children_id } 搜索结果 { 写选项 value="children_id" +indent+children_name+ /option 创建列表(children_id,缩进) } } 创建列表(空,“”);

    问候

    James Lin (guanfenglin@gmail.com)

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2015-05-22
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2019-05-05
      相关资源
      最近更新 更多