【问题标题】:Query for rows including child rows查询包含子行的行
【发布时间】:2010-04-07 15:32:27
【问题描述】:

几周前,我向a question 询问了如何从具有 parentID 列的表中生成分层 XML。 一切正常。重点是,按照层次结构,我也想查询一张表。

我给你举个例子:

这是带有代码的表格:

ID          CODE         NAME                                               PARENTID
1           ROOT         IndustryCode                                       NULL
2           IND          Industry                                           1
3           CON          Consulting                                         1
4           FIN          Finance                                            1
5           PHARM        Pharmaceuticals                                    2
6           AUTO         Automotive                                         2
7           STRAT        Strategy                                           3
8           IMPL         Implementation                                     3
9           CFIN         Corporate Finance                                  4
10          CMRKT        Capital Markets                                    9

我从中生成(用于在 TreeViewControl 中显示)此 XML:

<record key="1" parentkey="" Code="ROOT" Name="IndustryCode">
  <record key="2" parentkey="1" Code="IND" Name="Industry">
    <record key="5" parentkey="2" Code="PHARM" Name="Pharmaceuticals" /> 
    <record key="6" parentkey="2" Code="AUTO" Name="Automotive" /> 
  </record>
  <record key="3" parentkey="1" Code="CON" Name="Consulting">
    <record key="7" parentkey="3" Code="STRAT" Name="Strategy" /> 
    <record key="8" parentkey="3" Code="IMPL" Name="Implementation" /> 
  </record>
  <record key="4" parentkey="1" Code="FIN" Name="Finance">
    <record key="9" parentkey="4" Code="CFIN" Name="Corporate Finance">
      <record key="10" parentkey="9" Code="CMRKT" Name="Capital Markets" /> 
    </record>
  </record>
</record>

如您所见,有些代码从属于其他代码,例如AUTO

我想要的(并且完全不知道如何实现,甚至不知道从哪里开始)是能够查询另一个表(其中一列当然是这个特定的代码)获取代码并获取具有特定代码和所有下级代码的所有记录

例如:我在另一个表中查询“IndustryCode = IND[ustry]”并获取(当然)包含“IND”的记录,还有AUTO[motive]和PHARM[aceutical ](=所有下属)

它是具有高级服务的 SQL Express Server 2008。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008-express


    【解决方案1】:

    用途:

    WITH hierarchy AS (
       SELECT x.code
         FROM TABLE x
        WHERE x.code = @root_code
       UNION ALL
       SELECT y.code
         FROM TABLE y
         JOIN hierarchy h ON h.id = y.parentid)
    SELECT z.code
      FROM hierarchy z
    

    这是一个典型的(现在是 ANSI 标准)hierarchical query - 在 google 上可以找到很多关于它们的信息。

    【讨论】:

      【解决方案2】:

      我通常这样做的方法是添加一个keychain 列。对于您的数据:

      ID PARENTID 钥匙链 1 空 1 2 1 1.2 3 1 1.3 4 1 1.4 5 2 1.2.5 6 2 1.2.6 7 3 1.3.7 8 3 1.3.8 9 4 1.4.9 10 9 1.4.9.10

      这个列显然必须在插入时使用生成的 id 进行计算,但是一旦它在那里,您就可以非常简单地编写查询。

      SELECT *
      FROM mytable
      WHERE KEYCHAIN like '1.2.%' or KEYCHAIN = '1.2'
      

      可能还有其他方法可以做到这一点,但我发现这种方法效果很好。

      【讨论】:

      • 也可以使用嵌套集的方式,但是Keychain看起来更简单,只需要多填一个字段
      • 如何计算钥匙串?我猜一定有某种递归?
      • @MAD9,是的,这将是递归的形式。一行,虽然你可以写UPDATE mytable t1 SET KEYCHAIN = (SELECT KEYCHAIN FROM mytable t2 WHERE t1.PARENTID = t2.ID) + '.' + ID
      • 附带说明一下,看看 SQL2008 中的 hierachyid 支持。它会自动为您构建链条。
      • @CResults,我记得在 2008 年刚出的时候有人谈论过,但我从未使用过。下次需要设计层次表的时候,一定会研究一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多