15

Tôi mới phát triển SQL Server. Hầu hết kinh nghiệm của tôi đã được thực hiện với Oracle.Truy vấn đệ quy SQL Server

cho rằng tôi đã theo bảng dưới đây có chứa hẹn đối tượng

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) 

Một cuộc hẹn có thể bị trì hoãn như vậy, khi điều này xảy ra, một dòng mới được tạo ra trên các bảng với các lĩnh vực PrevAppointmentID chứa ID của bản gốc Cuộc hẹn.

Tôi muốn thực hiện truy vấn để có được lịch sử của cuộc hẹn Người. Ví dụ: nếu appoinment với ID = 1 bị trì hoãn hai lần và những lần hoãn này đã tạo các cuộc hẹn với ID = 7 và ID = 12 cho cùng một PersonID, tôi muốn thực hiện truy vấn trả về các kết quả sau:

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

Nếu sử dụng Oracle, tôi nhớ rằng có thể có được một thứ như thế này bằng mệnh đề CONNECT BY PRIOR.

Có cách nào để thực hiện truy vấn để đạt được các kết quả này không?

Tôi đang sử dụng SQL Server 2005/2008.

cảm ơn trước

Trả lời

18

Nhìn vào sử dụng những gì được gọi là CTE (biểu thức bảng chung) (Tham khảo 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