SQL Serverrecursion查询
我是SQL Server开发新手。 我的大部分经验都是用Oracle完成的。
假设我有下面的表包含约会对象
CREATE TABLE [dbo].[Appointments]( [AppointmentID] [int] IDENTITY(1,1) NOT NULL, ....... [AppointmentDate] [datetime] NOT NULL, [PersonID] [int] NOT NULL, [PrevAppointmentID] [int] NULL, CONSTRAINT [PK_Appointments] PRIMARY KEY CLUSTERED ([AppointmentID] ASC)
约会可以推迟,所以当发生这种情况时,会在表上创build一个新的行,其中PrevAppointmentID字段包含原始约会的ID。
我想查询获取一个人约会的历史。 例如,如果ID = 1的任命推迟了两次,并且这些延期已经为同一个PersonID创build了ID = 7和ID = 12的约会,我想进行一个查询,返回以下结果:
AppointmentID PrevAppointmentID ----------------- ---------------------- 1 NULL 7 1 12 7
如果使用Oracle,我记得使用CONNECT BY PRIOR子句可以得到类似这样的东西。
有没有什么办法来查询来实现这些结果?
我正在使用SQL Server 2005/2008。
提前致谢
研究使用所谓的CTE(公用表expression式):
;with cteAppointments as ( select AppointmentID, PersonID, PrevAppointmentID from Appointments where PrevAppointmentID is null union all select a.AppointmentID, a.PersonID, a.PrevAppointmentID from Appointments a inner join cteAppointments c on a.PrevAppointmentID = c.AppointmentID ) select AppointmentID, PrevAppointmentID from cteAppointments where PersonID = xxx