Sql 如何使用左联接视图在查询中添加前1名?

Sql 如何使用左联接视图在查询中添加前1名?,sql,sql-server,dbeaver,Sql,Sql Server,Dbeaver,我有3个相同的产品,ID=42,有3个不同的图像。我想从产品ID中获取第一个图像,我尝试添加“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

我有3个相同的产品,ID=42,有3个不同的图像。我想从产品ID中获取第一个图像,我尝试添加“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

您需要使用
OUTER APPLY
根据
Product ID
从Product\u image表中获取排名前1的图像数据

有关更多信息,请查看此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
将您的所有查询放在一个CTE中,其中包含一个新列,您将使用该列过滤结果。
这个新列是由按产品名称划分的ROW_NUMBER()函数生成的,所以您得到了一个错误?你为什么不告诉我们错误是什么?您是如何使用TOP 1的?请避免使用图像,添加一些示例数据和预期输出。您确定问题是关于SQL Server的吗?语法
Create或replace
是Oracle中的典型语法,而不是SQL Server中的典型语法,这意味着您收到了任何错误或没有给出预期的输出。
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