我正在使用一些学术DBMS,但不知道它是否实现了限制/顶级功能。是否有可能使用任何其他技术实现相同的目标?
说我有下一张桌子:
MovieId
Title
Year
ActorId
Name
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 = ...
答案 0 :(得分:5)
有几点想法:
在子查询中使用窗口函数(例如ROW_NUMBER()
)并选择行号为1的位置。但如果您的DBMS不够复杂而无法使用TOP / LIMIT,那么似乎不太可能它会有窗口功能。
将结果插入到具有自动递增标识类型列的表中。然后选择标识列为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'
)
如果某一年中有多个冠军,你还没有说要做什么。我真的希望你的数据库支持子查询。