2010-04-07 62 views
1

幾周前,我詢問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 < < IND < < ROOT

我想(和完全不知道如何實現,甚至,從哪裏開始)什麼是能夠查詢另一個表(其中一列就是這當然某些代碼)的代碼,並得到與特定代碼的所有記錄和所有從屬的代碼

例如:我查詢其他表爲「IndustryCode = IND [ustry]」,並獲得(當然)含有「IND」,而且 AUTO記錄[motive]和PHARM [aceutical](=所有下屬)

它與SQL Express Server 2008高級服務。

+0

感謝您的答案,到目前爲止,我會嘗試所有這些!但我必須打包(自從今天下午6點以後=)) – 2010-04-07 15:57:52

回答

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插入來計算的,但一旦它在那裏,你可以很簡單地寫你的查詢。

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

還有其他的方法可以做到這一點,但我發現這種方法工作得很好。

+0

您也可以使用嵌套集方法,但鑰匙串看起來更簡單,只需要一個額外的字段即可填充 – vittore 2010-04-07 15:50:25

+0

您將如何計算鑰匙串?我猜想有一些有點遞歸嗎? – 2010-04-07 15:53:57

+0

@ MAD9,是的,它會是遞歸的形式。對於一行,儘管你可以寫'UPDATE mytable t1 SET KEYCHAIN =(SELECT KEYCHAIN FROM mytable t2 WHERE t1.PARENTID = t2.ID)+'。' + ID' – Joel 2010-04-07 16:09:21

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 - 有很多關於谷歌他們被發現。