dar*_*n08 7 sql-server recursive-query sql-server-2008
以下是表的示例结构:
ID Name ParentID
-----------------------
1 Ancestor NULL
2 GrandFather 1
3 GrandMother 1
4 Child 3
Run Code Online (Sandbox Code Playgroud)
我正在尝试写一个会返回的查询
ID Name Family
----------------------------
1 Ancestor
2 GrandFather Ancestor
3 GrandMother Ancestor
4 Child Ancestor^GrandMother
Run Code Online (Sandbox Code Playgroud)
棘手的部分是我想以自上而下的顺序显示所有行的族.
如果有人能指出我正确的方向,将不胜感激:)
编辑::这是真正的查询,但它遵循相同的想法.它在行上返回错误:marketparent.family +'^'+ t2.marketGroupName因为它无法找到marketparent
WITH marketparent ( marketGroupID,parentGroupID, marketGroupName,family)
AS
(
SELECT marketGroupID,
parentGroupID,
marketGroupName,
'' as family
FROM EVE.dbo.invMarketGroups
WHERE parentGroupID IS NULL
UNION ALL
SELECT t2.parentGroupID,
t2.marketGroupID,
t2.marketGroupName,
marketparent.family + '^'+ t2.marketGroupName
FROM EVE.dbo.invMarketGroups as t2
INNER JOIN marketparent as mp
ON mp.marketGroupID = t2.parentGroupID
)
-- Statement using the CTE
SELECT TOP 10 *
FROM marketparent;
Run Code Online (Sandbox Code Playgroud)
你没有指定你的DBMS,所以我假设PostgreSQL
WITH RECURSIVE fam_tree (id, name, parent, family) as
(
SELECT id,
name,
parentid,
''::text as family
FROM the_unknown_table
WHERE parent IS NULL
UNION ALL
SELECT t2.id,
t2.name,
t2.parentid,
fam_tree.family || '^' || t2.name
FROM the_unknown_table t2
INNER JOIN fam_tree ON fam_tree.id = t2.parentid
)
SELECT *
FROM fam_tree;
Run Code Online (Sandbox Code Playgroud)
这是标准的SQL(除了::text类型转换),它应该在大多数现代DBMS上进行很少的更改.
编辑:
对于SQL Server,您需要使用Microsoft的非标准替换标准连接字符+(并且您需要删除recursive标准所需的关键字,但出于某些由SQL Server拒绝的奇怪原因)
WITH fam_tree (id, name, parent, family) as
(
SELECT id,
name,
parentid,
'' as family
FROM the_unknown_table
WHERE parent IS NULL
UNION ALL
SELECT t2.id,
t2.name,
t2.parentid,
fam_tree.family + '^' + t2.name
FROM the_unknown_table t2
INNER JOIN fam_tree ON fam_tree.id = t2.parentid
)
SELECT *
FROM fam_tree;
Run Code Online (Sandbox Code Playgroud)