Как получить одну запись на идентификатор от одной до многих связанных таблиц в MSSQL - PullRequest
1 голос
/ 16 апреля 2019

У меня есть одна ко многим связанным таблицам; таблица продуктов и их изображения по ProductID. Изображения могут существовать для идентификатора продукта, одного или нескольких, или не существовать вообще. Поэтому я оставил внешнее соединение с ними, если изображения не существуют, запись будет нулевой.

Я выбираю их по идентификатору категории, что означает, что могут быть и другие продукты, поэтому я не смог использовать топ 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   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?

1 Ответ

0 голосов
/ 16 апреля 2019

использование 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
...