gpt4 book ai didi

sql - 递归CTE查找父记录

转载 作者:行者123 更新时间:2023-12-04 13:35:09 28 4
gpt4 key购买 nike

首先,我必须承认我对sql server的recursive CTE's不是很熟悉,但是我认为这是最好的方法。

我有一个表tabData。它的PK名为idData,并且有一个自引用的FK oj​​it_code。

因此,fiData引用了父记录,而fiData返回了父记录的所有数据。这既简单又快速。但是,如何以自然顺序从给定记录中获取所有 parent ?
假设有一个 child (idData = 4)和3个 parent (第一个 parent 是idData = 3的记录):

idData    fiData 
4 3
3 2
2 1
1 NULL

我认为递归CTE是必经之路,但我对其语法不太满意。
那么实现返回所有 parent 的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];

先感谢您。

最佳答案

更改为:

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

给我您想要的结果。

关于sql - 递归CTE查找父记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935005/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com