Sql 如何从数据库中获取具有父记录的最后一个子记录
我有一个包含两个表的数据库:Sql 如何从数据库中获取具有父记录的最后一个子记录,sql,database,linq-to-sql,Sql,Database,Linq To Sql,我有一个包含两个表的数据库: 客户(Id PK,姓氏) 及 订单(Id PK、CustomerId FK、产品名称、价格等) 我只想检索客户的上次订单详细信息以及客户名称。 我使用.NET L2SQL,但我认为这是SQL问题,而不是LINQ问题,所以我在这里发布了我尝试过的SQL查询: SELECT [t0].[LastName], ( SELECT [t2].[ProductName] FROM ( SELECT TOP (1) [t1].[ProductNam
客户(Id PK,姓氏)
及
订单(Id PK、CustomerId FK、产品名称、价格等)
我只想检索客户的上次订单详细信息以及客户名称。
我使用.NET L2SQL,但我认为这是SQL问题,而不是LINQ问题,所以我在这里发布了我尝试过的SQL查询:
SELECT [t0].[LastName], (
SELECT [t2].[ProductName]
FROM (
SELECT TOP (1) [t1].[ProductName]
FROM [Orders] AS [t1]
WHERE [t1].[CustomerId] = [t0].[Id]
ORDER BY [t1].[Id] DESC
) AS [t2]
) AS [ProductName], (
SELECT [t4].[Price]
FROM (
SELECT TOP (1) [t3].[Price]
FROM [Orders] AS [t3]
WHERE [t3].[CustomerId] = [t0].[Id]
ORDER BY [t3].[Id] DESC
) AS [t4]
) AS [Price]
FROM [Customers] AS [t0]
问题是Orders有更多的列(30),每列查询都会变得更大、更慢,因为我需要添加下一个子查询
有没有更好的方法?在SQL Server 2005及更高版本中:
SELECT *
FROM (
SELECT o.*,
ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY o.id DESC) rn
FROM customers c
LEFT JOIN
orders o
ON o.customerId = c.id
) q
WHERE rn = 1
或者这个:
SELECT *
FROM customers c
OUTER APPLY
(
SELECT TOP 1 *
FROM orders o
WHERE o.customerId = c.id
ORDER BY
o.id DESC
) o
在SQL Server 2000中:
SELECT *
FROM customers с
LEFT JOIN
orders o
ON o.id =
(
SELECT TOP 1 id
FROM orders oi
WHERE oi.customerId = c.id
ORDER BY
oi.id DESC
)
在SQL 2008中:只有第二个有效,第1个:为“q”多次指定了列“Id”。@jlp:try now。应该明确指定内部查询中需要的列。