使用递归CTE查找父记录

6

首先我必须承认我对SQL Server的递归CTE并不是很熟悉,但我认为这是最好的方法。

我有一个名为tabData的表。它的主键名为idData,并且有一个自引用外键fiData

Schema

所以fiData引用了父记录,SELECT * FROM tabData WHERE idData=fiData返回父记录的所有数据。这很简单也很快。但是如何按照自然顺序获取给定记录的所有父记录呢?假设有一个子记录(idData=4)和三个父记录(第一个父记录是idData=3):

idData    fiData 
 4          3     
 3          2     
 2          1    
 1          NULL    

我认为递归CTE是可行的方法,但我不太熟悉它的语法。 那么实现返回所有父级的CTE的正确方法是什么?
我尝试了以下方法,但结果不正确(返回3,4而不是3,2,1): (为了测试,我为自己和您创建了一个临时表)
IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND  TABLE_NAME = 'tabData_Temp'))
BEGIN
 CREATE TABLE [dbo].[tabData_Temp](
  [idData] [int] NOT NULL,
  [fiData] [int] NULL,
   CONSTRAINT [PK_tabData_Temp] PRIMARY KEY CLUSTERED 
  (
   [idData] ASC
  )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
 );

 ALTER TABLE [dbo].[tabData_Temp]  WITH CHECK ADD  CONSTRAINT [FK_tabData_Temp] FOREIGN KEY([fiData])
 REFERENCES [dbo].[tabData_Temp] ([idData]);
 ALTER TABLE [dbo].[tabData_Temp] CHECK CONSTRAINT [FK_tabData_Temp];

 INSERT INTO [dbo].[tabData_Temp](idData,fiData)VALUES(1,NULL);
 INSERT INTO [dbo].[tabData_Temp](idData,fiData)VALUES(2,1);
 INSERT INTO [dbo].[tabData_Temp](idData,fiData)VALUES(3,2);
 INSERT INTO [dbo].[tabData_Temp](idData,fiData)VALUES(4,3);
END

/* here comes the (not working) recursive CTE */
Declare @fiData int;
SET @fiData = 3;
WITH PreviousClaims(idData,fiData) 
AS(
     SELECT parent.idData,parent.fiData
     FROM tabData_temp parent
     WHERE parent.idData = @fiData

     UNION ALL

     SELECT child.idData,child.fiData
     FROM tabData_temp child
     INNER JOIN PreviousClaims parent ON parent.idData = child.fiData
)
SELECT idData
FROM PreviousClaims;
/* end of recursive CTE */


DROP TABLE [dbo].[tabData_Temp];

提前感谢你。

2个回答

7

更改为:

INNER JOIN PreviousClaims parent ON parent.fiData = child.idData

给我你想要的结果。

6
您的加入方式是错误的。
请修改为:
INNER JOIN PreviousClaims parent ON parent.idData= child.fiData 

转换成这样

INNER JOIN PreviousClaims parent ON parent.fiData = child.idData

谢谢,Kirk Woll 比我快了几秒钟。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接