Помощь по присоединению рекурсивного запроса CTE ко второй таблице - PullRequest
2 голосов
/ 18 января 2011

Моя цель состоит в том, чтобы выполнить рекурсию по таблице tbl и при рекурсии по этой таблице выбрать аббревиатуру страны (если она существует) из другой таблицы tbl2 и добавить те результаты, которые включены в окончательный результат.

Пример, который я буду использовать, придет из этого поста

tbl2 имеет внешний ключ 'tbl_id' для tbl и выглядит следующим образом

INSERT INTO @tbl2( Id, Abbreviation, tbl_id ) 
VALUES 
 (100, 'EU', 1) 
,(101, 'AS', 2) 
,(102, 'DE', 3) 
,(103, 'CN', 5)

* Примечание: не во всех странах есть сокращения.

Хитрость в том, что я хочу, чтобы все страны Азии хотя бы показывали аббревиатуру Азии, которая называется «КАК», даже если в стране нет аббревиатуры (например, в Индии). Если в стране есть сокращение , результат должен выглядеть следующим образом: Китай: CN, AS

У меня это частично работает с использованием подзапроса, но Индия всегда возвращает NULL для сокращения. Он действует так, как будто нет полного рекурсивного пути назад к аббревиатуре, тогда он возвращает ноль. Может быть, решение состоит в том, чтобы использовать левое внешнее соединение в таблице сокращений? Я часами пробовал много разных вариантов, и подзапрос был настолько близок, насколько я мог.

WITH  abcd 
    AS ( 
          -- anchor 
        SELECT  id, [Name], ParentID, 
                CAST(([Name]) AS VARCHAR(1000)) AS "Path" 
        FROM    @tbl 
        WHERE   ParentId IS NULL 
        UNION ALL 
          --recursive member 
        SELECT  t.id, t.[Name], t.ParentID, 
                CAST((a.path + '/' + t.Name + ':' +                 
                (
                    select t2.abbreviation + ','
                    from @tbl2
                    where t.id = t2.id
                )) AS VARCHAR(1000)) AS "Path"

        FROM    @tbl AS t 
                JOIN abcd AS a 
                  ON t.ParentId = a.id 
       )
SELECT * FROM abcd

Кстати, я использую SQL Server 2005, если это имеет значение

1 Ответ

6 голосов
/ 18 января 2011

Попробуйте этот пример, который даст вам вывод (1 строка выборки)

...