Как добавить ТОП 1 в запрос с левым объединением в просмотрах? - PullRequest
0 голосов
/ 27 сентября 2019

У меня 3 одинаковых продукта в ID = 42, с 3 разными изображениями.Я хочу получить первое изображение из идентификатора продукта, я пытаюсь добавить «TOP 1», ошибка

Это мой запрос

CREATE OR REPLACE VIEW UserOrdersView
AS 
SELECT 
    u.[User_ID],
    p.Product_Name,
    p.Price, 
    o.Order_Price, 
    o.Order_ID, 
    i.[Image]
FROM Product p
LEFT JOIN Orders o ON o.Product_ID = p.Product_ID
INNER JOIN Users u ON u.[User_ID]= o.[User_ID]
LEFT JOIN Product_Images  i ON i.Product_ID = p.Product_ID
WHERE o.[User_ID] = 42

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019
WITH cte as (
    SELECT 
    u.[User_ID],
    p.Product_Name,
    p.Price, 
    o.Order_Price, 
    o.Order_ID, 
    i.[Image],
    ROW_NUMBER() OVER (PARTITION BY i.[Image] ORDER BY p.Product_Name) AS rn   
FROM Product p
LEFT JOIN Orders o ON o.Product_ID = p.Product_ID
INNER JOIN Users u ON u.[User_ID]= o.[User_ID]
LEFT JOIN Product_Images  i ON i.Product_ID = p.Product_ID
)
SELECT [User_ID],Product_Name,Price,Order_Price,Order_ID,[Image] FROM cte
WHERE rn=1

Поместите все ваши запросы в CTE с новым столбцом, который вы будете использовать для фильтрации результатов.Этот новый столбец создается с помощью функции ROW_NUMBER (), разделенной на Product_Name

0 голосов
/ 27 сентября 2019

Вам необходимо использовать OUTER APPLY, чтобы получить первые 1 данные изображения из таблицы Product_image на основе Product ID.

. Пожалуйста, отметьте этот Реальный пример из жизни, когда использовать OUTER / CROSSПРИМЕНЯЙТЕ в SQL stackoverflow ссылку для получения дополнительных знаний.

Пожалуйста, проверьте обновленный код представления для вашего ответа.

CREATE OR REPLACE VIEW UserOrdersView
AS 
BEGIN

    SELECT 
        u.[User_ID],
        p.Product_Name,
        p.Price, 
        o.Order_Price, 
        o.Order_ID, 
        i.[Image]
    FROM Product p
    INNER JOIN Users u ON u.[User_ID]= o.[User_ID]
    LEFT JOIN Orders o ON o.Product_ID = p.Product_ID
    OUTER APPLY 
    (
        SELECT TOP 1            
            T2.[Image]
        FROM Product_Images T2
        WHERE T2.Product_ID = p.Product_ID
    ) i
    WHERE o.[User_ID] = 42

END
GO
...