2013-10-14 192 views
0

出現屬性我有兩個表1:n的關係如何選擇不要在group by子句

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。
如何獲取?

+0

我想'PackageId'應該是'ProductId' – JDB

+0

你不會進行排序,則語句選擇頂部1? – dbarnes

+0

修復並在我的鑰匙中添加了雙列 - 就像我真正的問題 – Jeb

回答

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 
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)