Запрос для строк, включая дочерние строки

Несколько недель назад я задал вопрос о том, как генерировать иерархический XML из таблицы, в которой есть столбец parentID. Все отлично работает. Дело в том, что в соответствии с иерархией я также хочу запросить таблицу.

Я приведу вам пример:

Вот таблица с кодами:

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 с расширенными сервисами.

2 ответа

Решение

Я обычно делаю это, добавляя keychain колонка. Для ваших данных:

ID РОДИТЕЛЬНАЯ Брелок
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

Этот столбец, очевидно, должен быть рассчитан при вставке с использованием сгенерированного идентификатора, но как только он окажется там, вы можете написать свой запрос довольно просто.

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

Возможно, есть и другие способы сделать это, но я нашел, что этот метод работает довольно хорошо.

Использование:

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) иерархический запрос - о нем можно найти много интересного.

Другие вопросы по тегам