15

SQLServerの開発は初めてです。私の経験のほとんどはOracleで行われています。

Appointmentsオブジェクトを含む次のテーブルがあるとします

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)

アポイントメントは延期できるため、これが発生すると、元のアポイントメントのIDを含むPrevAppointmentIDフィールドを使用して新しい行がテーブルに作成されます。

個人の予定の履歴を取得するためにクエリを実行したいと思います。たとえば、ID = 1のappoinmentが2回延期され、これらの延期によって同じPersonIDに対してID=7とID=12の予定が作成された場合、次の結果を返すクエリを作成します。

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

Oracleを使用している場合、このようなものはCONNECTBYPRIOR句を使用して取得できることを覚えています。

これらの結果を達成するためにクエリを実行する方法はありますか?

SQLServer2005/2008を使用しています。

前もって感謝します

4

1 に答える 1

18

CTE (共通テーブル式) と呼ばれるものの使用を検討してください ( MSDN ドキュメントを参照)。

;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
于 2010-10-12T16:10:27.253 に答える