15

Jestem nowy w rozwoju SQL Server. Większość moich doświadczeń zostało zrobionych z Oracle.Zapytanie rekurencyjne SQL Server

Załóżmy, że mam poniższej tabeli, która zawiera Nominacje obiektów

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) 

Spotkanie może zostać przesunięty tak, to kiedy to się stanie, nowy wiersz jest tworzony na stole z pola PrevAppointmentID zawierającego identyfikator oryginału Spotkanie.

Chciałbym złożyć zapytanie do uzyskania historię a nominacje osób. Na przykład, jeśli zgłoszenie o ID = 1 jest odkładane dwukrotnie, a te opóźnienia utworzyły spotkania o ID = 7 i ID = 12 dla tego samego PersonID, chciałbym utworzyć zapytanie, które zwróci następujące wyniki:

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

przypadku korzystania z Oracle pamiętam, że coś takiego można uzyskać używając CONNECT po wcześniejszym punkcie.

Czy istnieje sposób na wykonanie zapytania w celu uzyskania tych wyników?

Używam programu SQL Server 2005/2008.

góry dzięki

Odpowiedz

18

przyglądać się przy użyciu co nazywa się CTE (wspólne wyrażenie tabela) (patrz MSDN document):

;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