SQL Server 2008选择表的所有列+;基于列值的同一表中的列

SQL Server 2008选择表的所有列+;基于列值的同一表中的列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表版本,带有复合键docId,verId: docId verId apprvDt old_verId ------ ------ ----------- ---------- A 3 03/20/2017 2 A 2 03/18/2017 1 A 1 03/16/2017 null B 1 03/18/2017 null C 2

我有一个表版本,带有复合键docId,verId:

docId   verId   apprvDt      old_verId   
------  ------  -----------  ----------
A       3       03/20/2017   2
A       2       03/18/2017   1
A       1       03/16/2017   null
B       1       03/18/2017   null
C       2       03/20/2017   1
C       1       03/16/2017   null
假设我选择docId=A,verId=3,查询应该返回

docId   verId   apprvDt      old_verId   old_apprvDt
------  ------  -----------  ----------  ------------
A       3       03/20/2017   2           03/18/2017
即检索旧版本的appvdt

我试过这样做

select a.docId, a.verId, a.apprvDt, a.old_verId, b.old_apprvDt  
from VERSION as a left join 
   (select x.docId, x.verId, x.apprvDt as old_apprvDt from REVISN as x 
    where x.docId = 'A' and x.verId = a.old_verId) as b
on b.docId = a.docId and b.verId = a.old_verId
但是我得到了一个多部分绑定错误


我想从版本中选择一行,包括旧版本的apprvDt(旧版本apprvDt)

您的问题解决方案如下所示:

select t1.*,
      b.apprvdt as old_apprvdt
from table1 t1
cross apply
(
select apprvdt from table1 t2 where t1.docid=t2.docid  
and t2.old_verid =t1.verid ) b
DECLARE @tbl TABLE(docId varchar(100),  verId int,  apprvDt datetime,  old_verId int)
insert into @tbl values('A',       3 ,      '03/20/2017',   2)
insert into @tbl values('A',       2 ,      '03/18/2017',   1)
insert into @tbl values('A',       1 ,      '03/16/2017',   NULL)
insert into @tbl values('B',       1 ,      '03/18/2017',   NULL)
insert into @tbl values('C',       2 ,      '03/20/2017',   1)
insert into @tbl values('C',       1 ,      '03/16/2017',   NULL)
select * from @tbl

;with data_table
as
(
select docId,verId,apprvDt,old_verId,
(select apprvDt from @tbl T2 where T2.docId=t1.docid and     T2.verId=t1.old_verId) 
old_apprvDt from @tbl t1
)
select * from data_table where docId='A' and verId=3
结果如下:

-------------------------------------------------------------------------------------
docId       verId   apprvDt                     old_verId       old_apprvDt
-------------------------------------------------------------------------------------
    A       3       2017-03-20 00:00:00.000     2                2017-03-18    00:00:00.000

返回的旧\u appvdt不正确。返回的表中甚至缺少一些行。缺少Order by