Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 从关系中选择最后一条记录_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 从关系中选择最后一条记录

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

我有这种情况。我有一个与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 = 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;

是的,我去掉了这个。这段代码是从一个较长的查询中提取出来的,它被插入了。谢谢你的解释!是的,我去掉了这个。这段代码是从一个较长的查询中提取出来的,它被插入了。谢谢你的解释!现在我有一个真正的大问题,你们都提供了几乎相同的答案!我想我会同意亚伦的回答,因为它有一个有趣的解释。谢谢你们现在我有一个很大的问题,你们提供了几乎相同的答案!我想我会同意亚伦的回答,因为它有一个有趣的解释。非常感谢。