sql – 用于查找父记录的递归CTE
发布时间:2020-12-12 16:26:24 所属栏目:MsSql教程 来源:网络整理
导读:首先,我必须承认我对sql server的 recursive CTE’s不是很熟悉,但我认为这是最好的方法. 我有一个表tabData.它的PK名为idData,并且有一个自引用FK fiData. 所以fiData引用父记录和SELECT * FROM tabData WHERE idData = fiData返回父记录的所有数据.这很简单
首先,我必须承认我对sql server的
recursive CTE’s不是很熟悉,但我认为这是最好的方法.
我有一个表tabData.它的PK名为idData,并且有一个自引用FK fiData. 所以fiData引用父记录和SELECT * FROM tabData WHERE idData = fiData返回父记录的所有数据.这很简单快捷.但是如何让自然顺序中的所有父母从特定记录中获取? idData fiData 4 3 3 2 2 1 1 NULL 我认为递归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 给我你想要的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |