SQL Server查询相关产品

时间:2018-08-18 09:54:52

标签: sql sql-server join

我正在尝试获取相关产品,但是我面临的问题是,存在与产品表具有一对多关系的产品照片表,因此当我通过匹配类别ID获得产品时,它也会返回多个该产品的产品照片我不想要。我只需要特定产品的产品照片表中的一张产品照片。有什么方法可以在联接中使用distinct或任何其他方式?到目前为止我做了什么...

 SELECT [Product].[ID],
  ,[Thumbnail]
  ,[ProductName]
  ,[Model]
  ,[SKU]
  ,[Price]
  ,[IsExclusive]
  ,[DiscountPercentage]
  ,[DiscountFixed]
  ,[NetPrice]
  ,[Url]
  FROM [dbo].[Product]
  INNER JOIN [ProductPhotos] ON [ProductPhotos].[ProductID]=[Product].[ID]
  INNER JOIN [ProductCategories] ON [ProductCategories].[ProductID]= 
  [Product].[ID]
  WHERE [ProductCategories].[CategoryID]=4

我得到的结果是...

IMG1

“产品照片”表具有

IMG2

有什么方法可以使用产品照片表中的产品ID列进行区分或分组,以仅返回照片表中的一行。

3 个答案:

答案 0 :(得分:3)

使用inner join代替使用cross apply

SELECT . . . 
FROM dbo.Product p CROSS APPLY
     (SELECT TOP (1) pp.*
      FROM ProductPhotos pp
      WHERE pp.ProductID = p.id
      ORDER BY NEW_ID()
     ) pp INNER JOIN
     ProductCategories pc
     ON pc.ProductID = p.id
WHERE pc.CategoryID = 4;

注意:

  • ORDER BY NEWID()选择一张随机照片。您可以按特定的列进行排序,以获取最早,最新,最大或其他内容。
  • 请注意,我添加了表别名。这些使查询更易于编写和阅读。
  • 您应限定查询中的所有列名,以便清楚它们来自哪个表。
  • 我除去了多余的方括号。它们只会使查询更难编写和阅读。

答案 1 :(得分:0)

您可以使用ROW_NUMBER()ProductID返回一行,如下所示:

JOIN (SELECT *,
             ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY PhotoID) rn
      FROM [ProductPhotos]) [ProductPhotos]
ON [ProductPhotos].[ProductID]=[Product].[ID] AND [ProductPhotos].rn = 1

代替此:

JOIN [ProductPhotos] ON [ProductPhotos].[ProductID]=[Product].[ID]

答案 2 :(得分:-1)

您可以在具有非连续的联接中使用子查询,而不是直接联接表。

您可以创建别名并在select语句中将该列用作不同的列,但是当内部有大量数据时,它将创建性能问题。

如果您为同一产品ID(例如2)有3张不同的照片。您可以使用PK desc的前1个子查询来获取最新图片。