【问题标题】:how to get single record per id from one to many related tables in mssql如何从mssql中的一个到多个相关表中获取每个id的单个记录
【发布时间】:2019-09-06 09:17:08
【问题描述】:

我有一对多的相关表;一个产品表,以及每个 ProductID 的图像。一个或多个 productID 的图像可以存在,也可以根本不存在。所以如果图像不存在,我离开外部加入它们,记录将为空。

我通过他们的类别 ID 选择它们,这意味着也可能有其他产品,所以我不能使用前 1 个。

我的查询:

select p.ID,p.ProductName,pc.CategoryID, pic.BigPath
from tbl_Products p
LEFT join tbl_ProductToCategory pc on p.ID = pc.ProductID
left outer join tbl_ProductImages pic on pic.ProductID = p.ID
where pc.CategoryID = 1174

由于表 ProductImages,上述查询获取了具有多条记录的所有产品。

我需要从产品图像表中获取单条记录;例如:具有最小图像 ID 的图像。

上面的查询得到这些:

ID   ProductName  CategoryID  BigPath

311  a            1174        www.blabla.com/cdn/a..
313  b            1174        www.blabla.com/cdn/b..
318  c            1174        www.blabla.com/cdn/c1..
318  c            1174        www.blabla.com/cdn/c2..
318  c            1174        www.blabla.com/cdn/c3..

我希望:

ID   ProductName  CategoryID  BigPath
311  a            1174        www.blabla.com/cdn/a..
313  b            1174        www.blabla.com/cdn/b..
318  c            1174        www.blabla.com/cdn/c1..

如何从 ProductImages 表中获取一条记录?

【问题讨论】:

  • 请添加具有预期输出的示例数据。
  • 将 WHERE 子句条件移动到(第一个)ON 子句以获得真正的 LEFT JOIN 结果。

标签: sql sql-server group-by one-to-many


【解决方案1】:

使用row_number()

select * from
(
select p.ID,p.ProductName, p.SalesPrice, pc.CategoryID, pic.BigPath,
row_number() over(partition by p.ID,p.ProductName order by pic.BigPath) as rn
from tbl_Products p
LEFT join tbl_ProductToCategory pc on p.ID = pc.ProductID
left outer join tbl_ProductImages pic on pic.ProductID = p.ID
where pc.CategoryID = 1174
)A where rn=1

【讨论】:

  • 但是您的代码只获取该类别的一个产品,我需要一个类别的所有产品,但每个产品 ID 有一个图像记录。 @fa06
  • @Zeynep,我已经更新了答案 - 你现在可以查看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多