выбрать одну строку из нескольких записей в таблицах отношений «Один ко многим» - PullRequest
0 голосов
/ 18 сентября 2018

В MSSQL у меня есть две таблицы с отношением один ко многим.

Таблицы:

tb_Products:
ID
ProductName

tb_Images:
ProductID
MidPath

В хранимой процедуре показывает продукты с их изображениями (также показывает нулевые записи), Иесли в tb_Images есть несколько productID, он показывает одну запись.

Я могу сделать эту работу с помощью этого запроса:

declare @rowIndexToFetch int
set @rowIndexToFetch=0

select p.ID,p.ProductName,p.CategoryID,c.ParentId,  
    pi.MidPath
    from tb_Products p
    join tb_Categories c
    on p.CategoryID=c.ID
    left outer join tb_Images pi
    on pi.ProductID=p.ID

    where c.ID=3 or c.ParentId=3

    order by pi.ID desc
    offset @rowIndexToFetch rows
    fetch next 1 rows only

Но, если я использую смещение и выборку, я больше не будуможет получить NULL-записи из tb_Images.Левое внешнее объединение больше не работает.

Пример записи записей возвращается без извлечения смещения:

ID    ProductName   CategoryID   ParentId  MidPath
154   Chef Ceket     33            3       /cdn/www.sample.com/x
154   Chef Ceket     33            3       /cdn/www.sample.com/y
154   Chef Ceket     33            3       /cdn/www.sample.com/z
1     Eldiven        3             3       NULL

с извлечением смещения:

ID    ProductName   CategoryID   ParentId  MidPath
154   Chef Ceket     33            3       /cdn/www.sample.com/x

ожидается возвращение:

   ID    ProductName   CategoryID   ParentId  MidPath
   154   Chef Ceket     33            3       /cdn/www.sample.com/x
   1     Eldiven        3             3       NULL

Проблема в том, что я не могу получить нулевые записи, когда использую инструкцию offset-fetch.Как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Попробуйте этот код, в productImage макс.1 значение для каждого productID.

WITH    productImage
      AS ( SELECT   MAX(pi.ID) AS ID
                  , pi.ProductID
           FROM     tb_Images pi
           GROUP BY pi.ProductID
         )
SELECT  p.ID
      , p.ProductName
      , p.CategoryID
      , c.ParentId
      , pi.MidPath
FROM    tb_Products p
        JOIN tb_Categories c ON p.CategoryID = c.ID
        LEFT OUTER JOIN productImage ON productImage.ProductID = p.ID
        LEFT OUTER JOIN tb_Images pi ON pi.ID = productImage.ID
WHERE   c.ID = 3
        OR c.ParentId = 3;
0 голосов
/ 19 сентября 2018

Согласно вашему комментарию, я думаю, вы неправильно понимаете поведение конструкции OFFSET FETCH.Посмотрите еще раз на руководства.

Если вы хотите получить результат, описанный выше, вы можете использовать такой запрос

WITH query AS (
    SELECT 
        p.ID,
        p.ProductName,
        p.CategoryID,
        c.ParentId,  
        pi.MidPath,
        rn = ROW_NUMBER() OVER( PARTITION BY p.ID ORDER BY pi.MidPath )-- in your code ORDER set by pi.ID but there's no evidence it exists
    FROM tb_Products p
    JOIN tb_Categories c ON p.CategoryID = c.ID
    LEFT JOIN tb_Images pi ON pi.ProductID = p.ID
    WHERE c.ID = 3 or c.ParentId = 3
)
SELECT ID, ProductName, CategoryID, ParentId, MidPath
FROM query
WHERE rn = 1
0 голосов
/ 18 сентября 2018
select distinct p.ID,p.ProductName,p.CategoryID,c.ParentId,  
    pi.MidPath
    from tb_Products p
    join tb_Categories c
    on p.CategoryID=c.ID
    left outer join tb_Images pi
    on pi.ProductID=p.ID

    where c.ID=3 or c.ParentId=3
        where c.ID=3 or c.ParentId=3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...