SQL Server query ricorsiva
-
29-09-2019 - |
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
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