我有一部有很多电影的filmdatabase
。电影可以有前一部分(或下一部分)。我想运行一个查询,显示包含所有以前的电影和所有下一部电影的列表。
该表包含以下列:
movie_id
| title
| previous_part
(这是上一部分的电影ID)| publication_year
这就是我现在所拥有的,但它不会起作用
SELECT TOP 1 e1.movie_id, e1.title, e1.previous_part
FROM dbo_Movie AS e1 INNER JOIN dbo_Movie AS e2 ON e1.movie_id = e2.previous_part
ORDER BY e1.publication_year;
e1.movie_id
是电影中随机部分的参数。
提前致谢!
答案 0 :(得分:0)
您能否澄清以下内容:
1)很多电影有1000 / 100,000 / 10,000,000(例如个人收藏,小型应用,全球图书馆) 2)您正在查看多少部分以及您希望如何呈现数据?
逻辑上明智的是,如果有一个合理数量的有限部分(小于10)你可以制作一些笨拙的sql构造来列出所有以前的部分和未来的部分。然而,如果你只是在它之前存在,如果它存在,那么如果它存在则你可以尝试:
解决方案1 :(列出所有电影部分以及上一部分和下一部分(如果存在)
select e1.movie_id, e1.title, pp.movie_id as prev_movie_id, np.movie_id as next_movie_id
from dbo_Movie AS e1
left join dbo_Movie AS pp
ON e1.previous_part = pp.movie_id
left join dbo_Movie AS np
ON np.previous_part = e1.movie_id
预期产出:
movie_id | title | prev_movie_id | next_movie_id
m1p2 | zed | m1p1 | m1p3
m1p3 | zed | m1p2 | null
m1p1 | zed | null | m1p2
m2p1 | phi | null | null
m3p1 | quo | null | m3p2
m3p2 | quo | m3p1 | null
解决方案2.1:列出所有电影部分和之前的下一部分
select e1.movie_id, e1.title, np.movie_id as next_movie_id
from dbo_Movie AS e1
inner join dbo_Movie AS np
ON np.previous_part = e1.movie_id
--inner join means anything rows where this isn't true will be removed
预期产出:
movie_id | title | next_movie_id
m1p2 | zed | m1p3
m1p1 | zed | m1p2
m3p1 | quo | m3p2
解决方案2.2:列出所有电影部分以及之前的下一部分
select e1.movie_id, e1.title, pp.movie_id as prev_movie_id
from dbo_Movie AS e1
inner join dbo_Movie AS pp
ON e1.previous_part = pp.movie_id
预期产出:
movie_id | title | prev_movie_id
m1p2 | zed | m1p1
m1p3 | zed | m1p2
m3p2 | quo | m3p1
注意:
1)对于prev_movie_id和next_movie_id都无法正常处理空值。
2)在SQL:1999中显然没有用于限制结果的ANSI sql标准,但是bobince在回复:[{3}}
中提到了后来的标准。