简体   繁体   English

SQL-派生表联接

[英]SQL - Derived table joining

I have a SQL query for a table in which the user can create multiple 'revisions' of a form. 我有一个用于表的SQL查询,用户可以在其中创建表单的多个“修订”。 Currently we pass in the ID of the revision into the query to retrieve the values (as you can probably guess), which is fine - however I want to extend to also select the previous revisions rows (if they is a previous revision). 当前,我们将修订的ID传递到查询中以检索值(您可能会猜到),这很好-但是,我想扩展为也选择先前的修订行(如果它们是先前的修订)。 Each revision has a number which is incremented when they create a new revision. 每个修订版本都有一个数字,在创建新修订版本时会增加。 Here's my query so far which doesn't seem to run (obviously the value 1,value 2 are the actual columns in my query) 这是到目前为止我的查询似乎没有运行(显然,值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)

It seems I can't access the main CVR row I'm selecting from my join. 看来我无法访问从联接中选择的CVR主行。 Any ideas? 有任何想法吗?

I made an SQL Fiddle with a simplified version to give you an idea how you can solve it. 我制作了一个带有简化版本的SQL Fiddle,以使您了解如何解决它。 SQL Fiddle Demo here SQL Fiddle演示在这里

That would be then about this 那将是关于这个

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

Edit: I made another SQL Fiddle to also take the DateId aspect in but I got a question: Is it that all CV revisions that belong together must be of same DateId and SageJobPK ? 编辑:我做了另一个SQL DateId也接受DateId方面,但我有一个问题:是所有的CV修订版必须属于相同的DateIdSageJobPK吗?

Looks like you need OUTER APPLY rather than OUTER JOIN 看起来您需要OUTER APPLY而不是OUTER JOIN

SELECT CVRs.*,
       PrevCVR.* /*TODO: Select desired columns*/
FROM   CVRs
       OUTER APPLY (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 ) 
SELECT   a.ID, a.SageJobID, a.SageJobPK, a.DateID, a.Revision, a.StatusID, a.Value1, a.Value2
FROM   CVRs as a
LEFT OUTER JOIN  CVRs as b
on .DateID = b.DateID AND a.SageJobPK = b.SageJobPK AND a.ID <> b.ID
where a.ID = @ID  ORDER BY b.Revision DESC

I think the easiest way to get multiple most recent revisions is using the ranking functions: 我认为获取多个最新修订的最简单方法是使用排名功能:

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 orders the revisions, by assigning 1 to the most recent, 2 to the second most recent, and so on. Seqnum通过将1分配给最新的版本,将2分配给第二个最新的版本,对修订进行排序,依此类推。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM