几周前,我向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。
答案 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'
可能有其他方法可以做到这一点,但我发现这种方法效果很好。