2010-10-14 111 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