0

我有两个具有 1:n 关系的表

Product (id1, id2, name, CreatedBy)
ProductVersion (id, ProductId1, ProductId2,VersionNumber, description)

(*每个包有多个版本(按顺序编号*包有 id1 和 id2,它们共同构成唯一键)

我查询每个产品的最新(顶级)版本如下

SELECT p.id1, p.id2, max(pv.VersionNumber)
FROM Product p 
join ProductVersion pv on p.Id1 = pv.ProductId1 and p.Id2 = pv.ProductId2
group by p.Id1, p.id2

现在,
我想要 pv.id - 作为顶部返回的版本的 id。
我如何获取它?

4

2 回答 2

1

您可以这样做,例如:

select p.id1, p.id2, pv.id
from Product as p
    outer apply (
        select top 1 t.id
        from ProductVersion as t
        where t.ProductId1 = p.Id1 and t.ProductId2 = p.Id2
        order by t.VersionNumber desc
    ) as pv

或使用 row_number() 方法:

with cte as (
    select
        p.id1, p.id2, pv.id,
        row_number() over(partition by p.id1, p.id2 order by pv.VersionNumber desc) as rn
    from Product as p
        left outer join ProductVersion as pv on pv.ProductId1 = p.Id1 and pv.ProductId2 = p.Id2
)
select * from cte where rn = 1
于 2013-10-14T14:06:19.880 回答
1

您可以进一步细化您的加入以仅在最大版本号上加入:

SELECT   p.id
       , pv.id AS VersionId
       , pv.VersionNumber
FROM     Product p 
JOIN     ProductVersion pv
     ON  p.Id = pv.ProductId
     AND pv.VersionNumber = (  SELECT MAX(VersionNumber)
                               FROM ProductVersion
                               WHERE ProductId = p.Id)
于 2013-10-14T14:06:43.437 回答