SQL派生表连接

SQL派生表连接,sql,Sql,我有一个SQL查询表,用户可以在其中创建表单的多个“修订版”。目前,我们将修订的ID传递到查询中,以检索您可能猜到的值,这很好-但是,如果以前的修订行是以前的修订行,我还想扩展以选择以前的修订行。每个修订都有一个数字,在创建新修订时,该数字将递增。到目前为止,我的查询似乎没有运行。显然,值1和值2是我查询中的实际列 SELECT ID, SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2 FROM CVRs LEF

我有一个SQL查询表,用户可以在其中创建表单的多个“修订版”。目前,我们将修订的ID传递到查询中,以检索您可能猜到的值,这很好-但是,如果以前的修订行是以前的修订行,我还想扩展以选择以前的修订行。每个修订都有一个数字,在创建新修订时,该数字将递增。到目前为止,我的查询似乎没有运行。显然,值1和值2是我查询中的实际列

SELECT ID, SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2
FROM   CVRs
LEFT OUTER JOIN (SELECT TOP(1) * 
                  FROM CVRs AS prevCVR 
                  WHERE (prevCVR.DateID = CVRs.DateID 
                    AND prevCVR.SageJobPK = CVRs.SageJobPK 
                    AND prevCVR.ID <> CVRs.ID) 
                  ORDER BY prevCVR.Revision DESC) AS 'PrevCVR'
WHERE        (CVRs.ID = @ID)
似乎我无法访问我从加入中选择的主CVR行。有什么想法吗?

看起来您需要外部应用,而不是外部连接

看起来您需要外部应用而不是外部联接


我制作了一个简化版本的SQL,让您了解如何解决它。SQL小提琴演示

那就这样了

SELECT ID, SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2
FROM   CVRs
WHERE  DateId in    ( select dateid    from cvrs where CVRs.ID = @ID)
  and  sagejobpk in ( select sagejobpk from cvrs where CVRs.ID = @ID)
order by revision desc

编辑:我制作了另一个版本,也考虑了DateId方面,但我有一个问题:所有属于一起的CV修订版都必须具有相同的DateId和SageJobPK吗?

我制作了一个简化版本的SQL,让您知道如何解决它。SQL小提琴演示

那就这样了

SELECT ID, SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2
FROM   CVRs
WHERE  DateId in    ( select dateid    from cvrs where CVRs.ID = @ID)
  and  sagejobpk in ( select sagejobpk from cvrs where CVRs.ID = @ID)
order by revision desc

编辑:我做了另一个也考虑了DateId方面,但我有一个问题:是否所有属于一起的CV修订都必须具有相同的DateId和SageJobPK?

我认为获得多个最新修订的最简单方法是使用排名函数:

select SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2
from (select CVR.*,
             row_number() over (partition by id order by revision desc) as seqnum
      from CVRs
     ) c
where c.ID = @ID and seqnum <= 2
order by revision desc

Seqnum对修订进行排序,将1分配给最近的修订,将2分配给第二个最近的修订,依此类推。

我认为获得多个最新修订的最简单方法是使用排名函数:

select SageJobID, SageJobPK, DateID, Revision, StatusID, Value1, Value2
from (select CVR.*,
             row_number() over (partition by id order by revision desc) as seqnum
      from CVRs
     ) c
where c.ID = @ID and seqnum <= 2
order by revision desc

Seqnum通过将1分配给最新版本、2分配给第二个最新版本等方式对修订进行排序。

在询问SQL问题时,请标记您的RDBMS和版本。我假设在询问SQL问题时,可能会使用Topplese中的SQL Server标记您的RDBMS和版本。我想可能是从上面的SQL Server