15

Sono nuovo allo sviluppo di SQL Server. La maggior parte della mia esperienza è stata fatta con Oracle.Query ricorsiva di SQL Server

supporre che abbia la seguente tabella che contiene appuntamenti oggetti

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) 

Un appuntamento può essere rimandata così, quando questo accade, una nuova riga viene creata sul tavolo con il campo PrevAppointmentID contenente l'ID dell'originale Appuntamento.

Vorrei fare una query per ottenere la cronologia degli appuntamenti di una persona. Ad esempio, se l'appuntamento con ID = 1 viene posticipato due volte e questi posticipi hanno creato appuntamenti con ID = 7 e ID = 12 per lo stesso PersonID, vorrei fare una query che restituisca i seguenti risultati:

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

Se si utilizza Oracle, ricordo che una cosa del genere può essere ottenuta usando la clausola CONNECT BY PRIOR.

C'è un modo per fare una query per raggiungere questi risultati?

Sto usando SQL Server 2005/2008.

grazie in anticipo

risposta

18

considerare di usare quello che viene chiamato un CTE (espressione di tabella comune) (fare riferimento alla 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