2010-10-14 95 views
6

首先,我必须承认,我不是很熟悉sql server的recursive CTE's,但我认为这是最好的方法。递归CTE查找父记录

我有一个表tabData。其PK被命名为idData,并有一个自引用FK fiData

Schema

所以fiData引用父记录和SELECT * FROM tabData WHERE idData=fiData回报父母的所有数据。这很简单快捷。但是如何让自然秩序中的所有父母都从特定记录中获得? 说有一个孩子(IDDATA = 4)3个父母(第一个父是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]; 

先谢谢你。

回答

7

更改为:

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

给我你想要的结果。

+2

谢谢,我非常接近;) – 2010-10-14 15:57:55

6

您有退出连接。

更改此

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

这个

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

谢谢,柯克沃尔是几秒钟的速度更快。 – 2010-10-14 16:06:57