嗨,我有一个引用自己的表,我需要能够从给定的父ID中选择父及其所有子记录。
我的表如下:
ID | ParentID | Name ----------------------- 1 NULL A 2 1 B-1 3 1 B-2 4 2 C-1 5 2 C-2
因此,对于上面的示例,我希望能够传递值1并获取上面的所有记录。
到目前为止,我已经提出了以下递归表值函数,但是它的行为不符合预期(仅返回第一条记录)。
CREATE FUNCTION [dbo].[SelectBranches] ( @id INT ,@parentId INT ) RETURNS @branchTable TABLE ( ID INT ,ParentID INT ,Name INT ) AS BEGIN IF @branchId IS NOT NULL BEGIN INSERT INTO @branchTable SELECT ID ,ParentID ,Name FROM tblLinkAdvertiserCity WHERE ID = @id END INSERT INTO @branchTable SELECT br.ID ,br.ParentID ,br.Name FROM @branchTable b CROSS APPLY dbo.SelectBranches(NULL, b.ParentID) br RETURN END GO
你可以试试这个
DECLARE @Table TABLE( ID INT, ParentID INT, NAME VARCHAR(20) ) INSERT INTO @Table (ID,ParentID,[NAME]) SELECT 1, NULL, 'A' INSERT INTO @Table (ID,ParentID,[NAME]) SELECT 2, 1, 'B-1' INSERT INTO @Table (ID,ParentID,[NAME]) SELECT 3, 1, 'B-2' INSERT INTO @Table (ID,ParentID,[NAME]) SELECT 4, 2, 'C-1' INSERT INTO @Table (ID,ParentID,[NAME]) SELECT 5, 2, 'C-2' DECLARE @ID INT SELECT @ID = 2 ;WITH ret AS( SELECT * FROM @Table WHERE ID = @ID UNION ALL SELECT t.* FROM @Table t INNER JOIN ret r ON t.ParentID = r.ID ) SELECT * FROM ret