首先,我必須承認,我不是很熟悉sql server的recursive CTE's,但我認爲這是最好的方法。遞歸CTE查找父記錄
我有一個表tabData
。其PK被命名爲idData
,並有一個自引用FK fiData
。
所以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];
先謝謝你。
謝謝,我非常接近;) – 2010-10-14 15:57:55