私の目的は、テーブル tbl を再帰し、そのテーブルを再帰しながら、別のテーブル tbl2 から国の略語 (存在する場合) を選択し、最終出力に含まれるそれらの結果を一緒に追加することです。
使用する例は、この投稿から取得します
tbl2 には tbl への外部キー 'tbl_id' があり、次のようになります。
INSERT INTO @tbl2( Id, Abbreviation, tbl_id )
VALUES
(100, 'EU', 1)
,(101, 'AS', 2)
,(102, 'DE', 3)
,(103, 'CN', 5)
*注: すべての国に略語があるわけではありません。
秘訣は、アジアのすべての国に、国に略語がない場合でも(たとえばインドのように)、少なくとも「AS」であるアジアの略語を表示することです。国に略語がある場合、結果は次のようになる必要があります: China:CN,AS
サブクエリを使用して部分的に機能していますが、インドでは略語に対して常に NULL が返されます。略語に戻る完全な再帰パスがない場合、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を使用しています