Domanda

Sono nuovo di sviluppo di SQL Server. La maggior parte della mia esperienza è stato fatto con Oracle.

Supponiamo che io ho 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 del supplementare originale.

Vorrei fare una query per ottenere la storia di un appuntamenti Person. Ad esempio, se l'appoinment con ID = 1 è rinviata due volte, e questi rinvii hanno creato gli appuntamenti con ID = 7 e ID = 12 per lo stesso PersonID, vorrei fare una query che restituisce i seguenti risultati:

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

Se si utilizza Oracle Mi ricordo che qualcosa di simile può essere ottenuto utilizzando la clausola CONNECT BY PRIOR.

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

Sto usando SQL Server 2005/2008.

grazie in anticipo

È stato utile?

Soluzione

considerare di usare quello che viene chiamato un CTE (espressione di tabella comune) (Fare riferimento a MSDN documento ):

;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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top