Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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

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 查找每个外键的表的最大记录的最佳方法是什么?_Sql_Sql Server 2008 - Fatal编程技术网

Sql 查找每个外键的表的最大记录的最佳方法是什么?

Sql 查找每个外键的表的最大记录的最佳方法是什么?,sql,sql-server-2008,Sql,Sql Server 2008,在工作中,我经常需要找到每个外键的最大状态。在大多数情况下,我总是在连接上使用相关子查询来获得正确的记录。这是假设最高的主键是最近的。这里有一个小演示 这在我使用的大多数查询中都非常快,更不用说能够在类型列的子查询中添加额外的条件了。我尝试使用NOT EXIST子句来确保没有更高的记录,但找不到其他任何记录。有人能提出更好的建议吗?如果有,为什么?我建议使用sandard窗口功能 ;with cte as ( select c.plateNumber, o.name,

在工作中,我经常需要找到每个外键的最大状态。在大多数情况下,我总是在连接上使用相关子查询来获得正确的记录。这是假设最高的主键是最近的。这里有一个小演示



这在我使用的大多数查询中都非常快,更不用说能够在类型列的子查询中添加额外的条件了。我尝试使用NOT EXIST子句来确保没有更高的记录,但找不到其他任何记录。有人能提出更好的建议吗?如果有,为什么?

我建议使用sandard窗口功能

;with cte as (
    select c.plateNumber, o.name, 
           row_number() over (partition by c.ownerId order by  purchaseDate desc) rw
    from car c
        inner join owner o
          on o.ownerid = c.ownerid
 )
 select * 
 from cte
 where rw=1;

允许您从任一表中获取所需内容,但仍然只获取一条记录

Car表和Owner表之间的关系是什么?如果需要最新记录,请使用datetime字段。那么您就不必做出假设。如果我理解正确,您的意思是查询只返回一行?@shree.pat18一对多关系。@AlexanderFedorenko父表中每个记录的最新行。我应该更清楚地回答我的问题。我想在一对多关系中获得每个父记录的最新子记录。这正是允许您执行的操作。只需将所需的额外列放入带有行计数的select中,并使order by成为定义“最近”的任何列。在没有完整的列列表的情况下,我假设有一个“购买”列,但它可以是lastupdated,id,无论您使用什么。我通常只使用PK,因为这是最高记录是最新记录的标准。但是回到要点,使用窗口/排名函数的版本有什么更好的地方呢?因为它不是一个相关的子查询。我相信它也给了查询优化器一个更好的加速的机会,因为它更好地描述了您想要的东西?我认为CTE对于非递归任务的速度非常慢。
;with cte as (
    select c.plateNumber, o.name, 
           row_number() over (partition by c.ownerId order by  purchaseDate desc) rw
    from car c
        inner join owner o
          on o.ownerid = c.ownerid
 )
 select * 
 from cte
 where rw=1;