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

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

15 голосов
/ 12 октября 2010

Я новичок в разработке 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, содержащим идентификатор исходной встречи.

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

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

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

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

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

заранее спасибо

1 Ответ

18 голосов
/ 12 октября 2010

Изучите использование так называемого 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
...