[英]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修订版必须属于相同的DateId
和SageJobPK
吗?
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.