15

SQL Server geliştirme konusunda yeniyim. Deneyimlerimin çoğu Oracle ile yapıldı. SQL Server özyinelemeli sorgu

Ben Atamalarını içeren Aşağıdaki tabloda bu olduğunda, yeni bir satır orijinal kimliğini içeren PrevAppointmentID alanıyla masaya oluşturulur,

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) 

randevu için ertelendiğini edilebilir nesneleri tahmin ediyorum Randevu.

Kişi randevularının geçmişini almak için bir sorgu yapmak istiyorum. Örneğin, ID = 1 ile randevu iki kez erteleniyorsa ve bu ertelemeler aynı PersonID için ID = 7 ve ID = 12 ile randevular oluşturduysa, aşağıdaki sonuçları veren bir sorgu oluşturmak istiyorum:

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

Oracle kullanılıyorsa, bunun gibi bir şeyin ÖNCEKİ BAĞLANTI yan tümcesi kullanılarak elde edilebileceğini hatırlıyorum.

Bu sonuçları elde etmek için sorgu oluşturmanın bir yolu var mı?

SQL Server 2005/2008 kullanıyorum.

cevap

18

bir CTE (ortak tablo ifade) ne denir kullanarak içine bak (MSDN document bakınız) önceden

teşekkürler:

;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