可以在不使用ORDER BY子句的情况下获得前1(最新)记录?

时间:2011-09-16 21:33:41

标签: sql

我正在使用一些学术DBMS,但不知道它是否实现了限制/顶级功能。是否有可能使用任何其他技术实现相同的目标?

说我有下一张桌子:

MovieId
Title
Year

演员

ActorId
Name

ActorInMovie

ActorId
MovieId

什么得到了名字演员给出的年度最新电影,例如:

select m.Title, m.Year
from ActorInMovie in
join Movies m on m.MovieId = in.MovieId
join Actors a on a.ActorId = in.ActorId
where
    a.Name = 'Bruce Willis'
and m.Year = ...

5 个答案:

答案 0 :(得分:5)

有几点想法:

  1. 在子查询中使用窗口函数(例如ROW_NUMBER())并选择行号为1的位置。但如果您的DBMS不够复杂而无法使用TOP / LIMIT,那么似乎不太可能它会有窗口功能。

  2. 将结果插入到具有自动递增标识类型列的表中。然后选择标识列为1的位置。

答案 1 :(得分:4)

这是很有可能的,只要你不介意拍摄演员最近一年制作的所有电影。诀窍是在内部SELECT中推导出最近一年的演员。

 select m.Title, m.Year
 from ActorInMovie in
 join Movies m on m.MovieId = in.MovieId
 join Actors a on a.ActorId = in.ActorId
 where
     a.Name = 'Bruce Willis'
 and m.Year = (SELECT MAX(m2.Year) 
    from ActorInMovie in2
    join Movies m2 on m2.MovieId = in2.MovieId
    join Actors a2 on a2.ActorId = in2.ActorId
    where a.Name = 'Bruce Willis')

答案 2 :(得分:2)

对你正在使用的数据库一无所知...标准的sql允许人们说

-- set result set size to 1 row
set rowcount 1

-- execute select statement of choice
select *
from foo

-- restore unlimited result set size
set rowcount 0

话虽如此,如果您不对ORDER BY应用排序, 返回1行将无法保证,但在大多数实现中,同一行通常是每次都回来。

答案 3 :(得分:2)

如果“最新”被定义为您记录的最新时间戳:

select *
from your_tables
where your_conditions
and timestamp = (
    select max(timestamp) 
    from your_tables
    where your_conditions
)

如果相同的条件有两个相同的时间戳, 可以获取多条记录,但通常会是极不可能。

答案 4 :(得分:2)

SELECT m.Title, m.Year FROM ActorInMovie in
join Movies m on m.MovieId = in.MovieId
join Actors a on a.ActorId = in.ActorId
where
  a.Name = 'Bruce Willis'
  AND m.Year = (
    SELECT MAX(year) FROM ActorInMovie in
    join Movies m on m.MovieId = in.MovieId
    join Actors a on a.ActorId = in.ActorId
    where
      a.Name = 'Bruce Willis'
  )

如果某一年中有多个冠军,你还没有说要做什么。我真的希望你的数据库支持子查询。