Присоединиться к первым n записей из дочерней таблицы - PullRequest
1 голос
/ 24 января 2020

Я изо всех сил пытаюсь выяснить, как выбрать только первые 4 записи из дочерней таблицы для записи в родительской таблице в отношении master-detail.

Пример таблиц:

Product         ProductImage
---------       -------------------
Id | Name       PKeyFld1 | PKeyFld2
---------       -------------------
 1 | Apple             1 |        1
 2 | Banana            1 |        2
 3 | Cranberry         1 |        3
                       1 |        4
                       1 |        5
                       2 |        1
                       2 |        2
                       2 |        3
                       3 |        1
                       3 |        3
                       3 |        4
                       3 |        8
                       3 |        9

Первичный ключ для ProductImage является комбинацией двух отображаемых полей. Мне нужно получить первые 4 изображения для каждого продукта, упорядоченные по PKeyFld1, PKeyFld2, что приведет к:

ProductImage
-------------------
PKeyFld1 | PKeyFld2
-------------------
       1 |        1
       1 |        2
       1 |        3
       1 |        4
       2 |        1
       2 |        2
       2 |        3
       3 |        1
       3 |        3
       3 |        4
       3 |        8

Самое хорошее решение - это иметь только один запрос с 1 записью на каждый продукт, но я могу также иметь дело с двумя запросами; 1 для продуктов и 1 для изображений. В C# я могу получить их и добавить данные изображения в модель перед дальнейшей обработкой.

Может кто-нибудь помочь мне с запросом для productImages? Сложнее всего получить только 4 верхних изображения для каждого продукта, не ограничивая всю таблицу ProductImage только 4 записями. Я делал это с Postgres в прошлом, но не могу найти, как это сделать на SQL сервере.

1 Ответ

1 голос
/ 24 января 2020

Вы можете использовать row_number() для решения этой проблемы с наибольшим числом групп. Что касается вопросов, вам не нужно привлекать таблицу Product.

select PKeyFld1, PKeyFld2
from (
    select t.*, row_number() over(partition by PKeyFld1 order by PKeyFld2) rn 
    from ProductImage t
) t
where rn <= 4
order by PKeyFld1, PKeyFld2
...