Запрос для строк, включая дочерние строки
Несколько недель назад я задал вопрос о том, как генерировать иерархический 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) иерархический запрос - о нем можно найти много интересного.