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