Sql server 2008 从关系中选择最后一条记录
我有这种情况。我有一个与OrderStatus相关的Orders表 订单状态 id | orderId |已创建 我需要检索订单的最后状态。我尝试了这个查询,但我不知道它是否有效。我需要知道是否有更好的解决方案Sql server 2008 从关系中选择最后一条记录,sql-server-2008,tsql,Sql Server 2008,Tsql,我有这种情况。我有一个与OrderStatus相关的Orders表 订单状态 id | orderId |已创建 我需要检索订单的最后状态。我尝试了这个查询,但我不知道它是否有效。我需要知道是否有更好的解决方案 select Orders.id, OrderStatus.status from Orders inner join OrderStatus on OrderStatus.id = (select top 1 id from OrderStatus where orderId
select Orders.id, OrderStatus.status from Orders
inner join OrderStatus on OrderStatus.id =
(select top 1 id from OrderStatus where orderId = Order.id order by created desc)
您可以使用以下功能:
WITH CTE AS
(
SELECT Orders.id, OrderStatus.status,
RN = ROW_NUMBER() OVER (
PARTITION BY OrderStatus.OrderId
ORDER BY created DESC)
FROM Orders
INNER JOIN OrderStatus ON OrderStatus.OrderId = Orders.id
)
SELECT id, status
FROM CTE WHERE RN = 1
我使用了,因为它可以直接过滤,而且可读性很强。您可以使用以下功能:
WITH CTE AS
(
SELECT Orders.id, OrderStatus.status,
RN = ROW_NUMBER() OVER (
PARTITION BY OrderStatus.OrderId
ORDER BY created DESC)
FROM Orders
INNER JOIN OrderStatus ON OrderStatus.OrderId = Orders.id
)
SELECT id, status
FROM CTE WHERE RN = 1
我使用了,因为它可以直接过滤,而且可读性很强。相关子查询通常是个坏消息,有时SQL Server可以对其进行优化,有时它就像一个非常慢的循环。也不知道为什么你认为你需要独特的时候,你只采取最新的状态,除非你没有任何主键
;WITH x AS
(
SELECT o.id, os.status,
rn = ROW_NUMBER() OVER (PARTITION BY os.orderId ORDER BY created DESC)
FROM dbo.Orders AS o
INNER JOIN dbo.OrderStatus AS os
ON o.id = os.orderId
)
SELECT id, status
FROM x
WHERE rn = 1;
相关子查询通常是个坏消息,有时SQL Server可以对其进行优化,有时它就像一个非常慢的循环。也不知道为什么你认为你需要独特的时候,你只采取最新的状态,除非你没有任何主键
;WITH x AS
(
SELECT o.id, os.status,
rn = ROW_NUMBER() OVER (PARTITION BY os.orderId ORDER BY created DESC)
FROM dbo.Orders AS o
INNER JOIN dbo.OrderStatus AS os
ON o.id = os.orderId
)
SELECT id, status
FROM x
WHERE rn = 1;
是的,我去掉了这个。这段代码是从一个较长的查询中提取出来的,它被插入了。谢谢你的解释!是的,我去掉了这个。这段代码是从一个较长的查询中提取出来的,它被插入了。谢谢你的解释!现在我有一个真正的大问题,你们都提供了几乎相同的答案!我想我会同意亚伦的回答,因为它有一个有趣的解释。谢谢你们现在我有一个很大的问题,你们提供了几乎相同的答案!我想我会同意亚伦的回答,因为它有一个有趣的解释。非常感谢。