Kri*_*ota -1 sql-server hierarchy select
我有以下 SQL Server 2008 表和数据:
CREATE TABLE dbo.MyTable (Sno int, refid int);
INSERT INTO dbo.MyTable VALUES
(17, 8),
(16, 8),
(15, 7),
(14, 7),
(13, 6),
(12, 6),
(11, 5),
(10, 5),
(9, 4),
(8, 4),
(7, 3),
(6, 3),
(5, 2),
(4, 2),
(3, 1),
(2, 1),
(1, 0);
Run Code Online (Sandbox Code Playgroud)
请注意,Sno2 和 3 引用Sno同一个表中的 1(自引用)。所以 2 和 3 是 1 的孩子,1 是 2 和 3 的父母。
我将传入一个Sno值(例如 4),我需要:
Sno结果集中的所有父项。Sno另一个结果集中的所有子项。我需要显示每个结果集的前 10 个级别。
这说明了关系并显示了我迄今为止所尝试的:
SELECT refid FROM dbo.MyTable
WHERE Sno = (SELECT refid FROM dbo.MyTable WHERE Sno = 4);
GO
SELECT refid FROM dbo.MyTable WHERE Sno = 4;
GO
Select Sno FROM dbo.MyTable
WHERE refid = (SELECT refid FROM dbo.MyTable WHERE Sno = 4);
GO
Run Code Online (Sandbox Code Playgroud)
对于直接父母及其祖先
WITH Parent (refid, Sno, Level)
AS
(
SELECT refid, Sno, 0 AS Level
FROM dbo.MyTable m
WHERE Sno=4
UNION ALL
SELECT m.refid, m.Sno, Level+1
FROM dbo.MyTable m
INNER JOIN Parent p
ON p.refid = m.Sno
)
SELECT refid, Level
FROM Parent;
Run Code Online (Sandbox Code Playgroud)
对于直系子女和所有孙子
WITH Child (refid, Sno, Level)
AS
(
SELECT refid, Sno, 0 AS Level
FROM dbo.MyTable m
WHERE Sno=4
UNION ALL
SELECT m.refid, m.Sno, Level+1
FROM dbo.MyTable m
INNER JOIN Child p
ON p.Sno = m.refid
)
SELECT Sno, Level
FROM Child
WHERE Sno <> 4;
Run Code Online (Sandbox Code Playgroud)
上述级别是父/子的层次结构。
更多关于递归 CTE 的信息可以在这里找到http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
| 归档时间: |
|
| 查看次数: |
19805 次 |
| 最近记录: |