【发布时间】:2011-01-18 02:39:10
【问题描述】:
我的目标是通过表 tbl 进行递归,并在通过该表进行递归时从另一个表 tbl2 中选择一个国家/地区缩写(如果存在)并将这些结果附加在一起,这些结果将包含在最终输出中。
我将使用的示例将来自from this post
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
我已经使用子查询部分地工作了,但是 India 总是返回 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
【问题讨论】:
-
你在寻找什么输出,列和示例格式请
-
你下面的输出就好了。
标签: sql sql-server-2005 subquery recursive-query