Моя цель состоит в том, чтобы выполнить рекурсию по таблице 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, если это имеет значение