Как создать накопительный, «производный» столбец предков, используя SQL Server 2008ierarchyid - PullRequest
1 голос
/ 07 июля 2010

Представьте себе типичную иерархию менеджера / сотрудника, где у вас есть сотрудник с боссом, у которого, в свою очередь, есть босс, у которого в свою очередь есть босс.

Как бы вы написали запрос, в котором был бы столбец, скажем, со всеми именами босса как varchar.

Учитывая эти данные (опуская столбец иерархии, но столбец id здесь по существу описывает этот столбец):

id | name          | bossid
1  | BigBoss       | 0
2  | CTO           | 1
3  | CTO Lackey    | 2
4  | CIO           | 1
5  | CIO Lackey    | 4

Получите этот набор результатов:

id | name          | all boss names
1  | BigBoss       |
2  | CTO           |Big Boss
3  | CTO Lackey    |Big Boss, CTO
4  | CIO           |Big Boss
5  | CIO Lackey    |Big Boss, CIO

Спасибо!

1 Ответ

1 голос
/ 07 июля 2010

Поскольку вы работаете с SQL 2008:

;WITH CTE_Tree AS
(
    SELECT
        id,
        name,
        '' AS boss_names
    FROM
        My_Table
    WHERE
        boss_id IS NULL
    UNION ALL
    SELECT
        T.id,
        T.name,
        CTE.boss_names + ', ' + CTE.name
    FROM
        CTE_Tree CTE
    INNER JOIN My_Table T ON
        T.boss_id = CTE.id
)
SELECT
    id,
    name,
    boss_names
FROM
    CTE_Tree

Это от макушки моей головы, так что, возможно, вам понадобится настроить его. У него будет дополнительная запятая в начале имени_босса. Вы можете удалить это в своем последнем запросе или поставить проверку CTE.boss_names в CTE, чтобы решить, стоит ли ставить запятую или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...