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

私が望んでいるのは(そして、どのように実現するか、どこから始めればよいのかまったくわからない)、別のテーブル(もちろん、1つの列はこの特定のコードです)にコードを照会し、特定のコードを含むすべてのレコードを取得できるようにすることです。すべての従属コード

例:他のテーブルで「IndustryCode = IND [ustry]」をクエリし、(もちろん)「IND」を含むレコードを取得しますが、 AUTO[motive]とPHARM[aceutical](=すべての部下)も取得します

高度なサービスを備えたSQLExpressServer2008です。

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標準の)階層クエリです-それらについてグーグルで見つけることがたくさんあります。

于 2010-04-07T15:49:48.890 に答える
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'

これを行うにはおそらく他の方法がありますが、私はこの方法がかなりうまく機能することを発見しました。

于 2010-04-07T15:47:16.673 に答える