查询包含子行的行

时间:2010-04-07 15:32:28

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

几周前,我向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&lt;&lt; IND&lt;&lt; ROOT

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

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

它是一个带有高级服务的SQL Express Server 2008。

2 个答案:

答案 0 :(得分: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 - 谷歌上有很多关于它们的内容。

答案 1 :(得分:0)

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

ID          PARENTID       KEYCHAIN
1           NULL           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在insert处计算此列,但是一旦它在那里,您可以非常简单地编写查询。

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

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