加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL Server递归查询

发布时间:2020-12-12 16:18:56 所属栏目:MsSql教程 来源:网络整理
导读:我是SQL Server开发的新手.我的大部分经验都是用Oracle完成的. 假设我有包含约会对象的下表 CREATE TABLE [dbo].[Appointments]( [AppointmentID] [int] IDENTITY(1,1) NOT NULL,....... [AppointmentDate] [datetime] NOT NULL,[PersonID] [int] NOT NULL,[P
我是SQL Server开发的新手.我的大部分经验都是用Oracle完成的.

假设我有包含约会对象的下表

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)

预约可以推迟,所以当这种情况发生时,在表上创建一个新行,其中PrevAppointmentID字段包含原始约会的ID.

我想询问一个人的任命历史.例如,如果id = 1的appoinment被推迟两次,并且这些延迟已经为同一PersonID创建了ID = 7和ID = 12的约会,我想进行一个查询返回以下结果:

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

如果使用Oracle,我记得可以使用CONNECT BY PRIOR子句获得类似的东西.

有没有办法进行查询来实现这些结果?

我正在使用SQL Server 2005/2008.

提前致谢

解决方法

看看使用什么叫CTE(普通表表达式):
;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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读