使用自定义连接表选择多对多关系中的第一行

时间:2017-02-12 05:24:49

标签: sql sql-server join

我有三张M-M关系表:

enter image description here

我在尝试找出如何只检索Inventory.Stock ASC订购的第一个相关广告资源项目的所有捆绑包时遇到了很多麻烦,但也返回了Bundles_Inventory.InventoryRequired字段。

我已经看到了对类似问题的其他回复,但没有一个考虑到自定义联接表。

如何选择Inventory.Stock ASC订购的所有捆绑包,还包括该记录的Bundles_Inventory.InventoryRequired?

关于@imran
原来我有:

SELECT b.Id, b.Name, i.Id, i.Name, i.Stock, bi.InventoryRequired from         Bundles b
INNER JOIN Bundles_Inventory bi ON b.Id = bi.BundleId
INNER JOIN Inventory i ON bi.InventoryId = i.Id
WHERE b.ClientId = @clientId
ORDER BY i.Stock ASC  

但显然这会让我获得有关Bundles表的重复数据..

然后我尝试了

SELECT TOP 1 b.Id, b.Name, i.Id, i.Name, i.Stock, bi.InventoryRequired from Bundles b
INNER JOIN Bundles_Inventory bi ON b.Id = bi.BundleId
INNER JOIN Inventory i ON bi.InventoryId = i.Id
WHERE b.ClientId = @clientId
ORDER BY i.Stock ASC  

现在,我正试图弄清楚如何应用Group By来解决这个问题。

1 个答案:

答案 0 :(得分:2)

您可以在大多数数据库中使用row_number()执行此操作:

select b.*, i.*
from bundles b join
     (select i.*,
             row_number() over (partition by bi.bundleid order by i.stock desc) as seqnum
      from bundles_inventory bi join
           Inventory i 
           on bi.InventoryId = i.Id
     ) i
     on b.id = bi.bundleid 
where seqnum = 1;

您可以在外部查询中添加where子句。