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