Подтвердить что ты не робот

Рекурсивный запрос SQL Server

Я новичок в разработке 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)

Назначение может быть отложено, поэтому, когда это произойдет, в таблице создается новая строка с полем PrevAppointmentID, содержащим идентификатор оригинального Назначения.

Я хотел бы сделать запрос, чтобы получить историю назначений Person. Например, если appoinment с ID = 1 откладывается два раза, и эти отсрочки создали встречи с ID = 7 и ID = 12 для одного и того же PersonID, я хотел бы сделать запрос, который возвращает следующие результаты:

AppointmentID         PrevAppointmentID
-----------------    ----------------------
1                     NULL
7                     1
12                    7

Если я использую Oracle, я помню, что нечто подобное можно получить, используя предложение CONNECT BY PRIOR.

Есть ли способ сделать запрос для достижения этих результатов?

Я использую SQL Server 2005/2008.

заблаговременно

4b9b3361

Ответ 1

Посмотрите на использование так называемого CTE (общее табличное выражение) (см. документ MSDN):

;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