我正在尝试获取相关产品,但是我面临的问题是,存在与产品表具有一对多关系的产品照片表,因此当我通过匹配类别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
我得到的结果是...
“产品照片”表具有
有什么方法可以使用产品照片表中的产品ID列进行区分或分组,以仅返回照片表中的一行。
答案 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个子查询来获取最新图片。