Some days ago I asked a question on SO regarding help on a recursive query.
The problem of that question was "How to get the history of a Person appointments".
Now I am having a problem similar to that one but it should answer to a slightly different question:
How to get an Appointment history?
For example if Appointment with ID = 5 has been postponed once and it was a postponement of another appointment how do I get the following result?
AppointmentID PrevAppointmentID
----------------- ----------------------
1 NULL
5 1
12 5
Thanks for helping
Update:
These scripts will help to create the table for your trials
CREATE TABLE [dbo].[Appointments](
[AppointmentID] [int] IDENTITY(1,1) NOT NULL,
[IssueID] [int] NOT NULL,
[Location] [varchar](255) NOT NULL,
[Description] [varchar](255) NOT NULL,
[AppointmentDate] [datetime] NOT NULL,
[AppointmentHour] [datetime] NOT NULL,
[Done] [bit] NOT NULL,
[PrevAppointmentID] [int] NULL,
CONSTRAINT [PK_Appointments] PRIMARY KEY CLUSTERED
(
[AppointmentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
I didn't want to completely hijack his answer, so:
Using Brad's Answer
Here is the query to get the complete history:
WITH cte
AS ( SELECT AppointmentId ,
PrevAppointmentId
FROM Appointments
WHERE AppointmentId = @AppointmentId
UNION ALL
SELECT prev.AppointmentId ,
prev.PrevAppointmentId
FROM Appointments prev
INNER JOIN cte curr ON prev.AppointmentId = curr.PrevAppointmentId
),
cte1
AS ( SELECT AppointmentId ,
PrevAppointmentId
FROM Appointments
WHERE AppointmentId = @AppointmentId
UNION ALL
SELECT prev.AppointmentId ,
prev.PrevAppointmentId
FROM Appointments prev
INNER JOIN cte1 curr ON prev.PrevAppointmentId = curr.AppointmentId
)
SELECT *
FROM cte
UNION
SELECT *
FROM cte1
Logic:
Query:
DECLARE @appointmentId INT
SET @appointmentId = 3
--
;
WITH past
AS ( SELECT AppointmentId ,
PrevAppointmentId
FROM Appointments
WHERE AppointmentId = @AppointmentId
UNION ALL
SELECT prev.AppointmentId ,
prev.PrevAppointmentId
FROM Appointments prev
INNER JOIN cte curr ON prev.AppointmentId = curr.PrevAppointmentId
),
future
AS ( SELECT AppointmentId ,
PrevAppointmentId
FROM Appointments
WHERE AppointmentId = @AppointmentId
UNION ALL
SELECT prev.AppointmentId ,
prev.PrevAppointmentId
FROM Appointments prev
INNER JOIN cte1 curr ON prev.PrevAppointmentId = curr.AppointmentId
)
SELECT *
FROM past OPTION(MAXRECURSION 500)
UNION
SELECT *
FROM future OPTION(MAXRECURSION 500)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With