nei*_*b14 11 sql sql-server sql-server-2005
当我在Oracle商店工作时,我认为CONNECT_BY是理所当然的.现在我不得不使用SQL Server 2005并且有一些讨厌的对象层次结构.具体来说,我们有一个自引用表,其中所有子记录都有一个父级id的列.目前,我们有一个视图,将子映射映射到层次结构中的级别,以及一个令人讨厌的查询,它将父母与子女联系起来.虽然这种方法有效,但它远非优雅和臭味.我只是好奇其他人如何从SQL Server 2005中检索分层数据.
Mar*_*sen 25
这将创建典型的分层表,并使用CTE选择层次结构并为每个项创建路径.
CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128));
INSERT INTO tblHierarchy VALUES (1, NULL, '1');
INSERT INTO tblHierarchy VALUES (2, NULL, '2');
INSERT INTO tblHierarchy VALUES (3, NULL, '3');
INSERT INTO tblHierarchy VALUES (4, 1, '1.1');
INSERT INTO tblHierarchy VALUES (5, 1, '1.2');
INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1');
WITH Parent AS
(
SELECT
ID,
ParentID,
Name AS Path
FROM
tblHierarchy
WHERE
ParentID IS NULL
UNION ALL
SELECT
TH.ID,
TH.ParentID,
CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path
FROM
tblHierarchy TH
INNER JOIN
Parent
ON
Parent.ID = TH.ParentID
)
SELECT * FROM Parent
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
ID ParentID Path
1 NULL 1
2 NULL 2
3 NULL 3
4 1 1/1.1
5 1 1/1.2
6 4 1/1.1/1.1.1
Run Code Online (Sandbox Code Playgroud)