2

几周前,我问了一个关于如何从具有 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 << IND << ROOT

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

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

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

4

2 回答 2

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 标准)分层查询- 在 google 上可以找到很多关于它们的信息。

于 2010-04-07T15:49:48.890 回答
0

我通常这样做的方法是添加一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'

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

于 2010-04-07T15:47:16.673 回答