如何解决SQL:创建一个比较不同行的视图
我有一些类似这样的电影数据:
cast_id | cast_name | movie_id
1 A 11
2 B 11
3 C 11
4 D 12
5 E 12
1 A 13
我想创建一个视图,在该视图中比较两个不同的演员,这样我就可以从以下内容开始:
CREATE VIEW compare(cast_id_1,cast_id_2,num_movies);
SELECT * FROM compare LIMIT 1;
(1,2,2)
我正在看演员A和演员B,他们两个之间总共有2部电影。
不确定如何比较两个不同的行,到目前为止,我的搜索器均未成功。任何帮助深表感谢!
解决方法
这是一种自我加入:
create view myview as
select t1.cast_id cast_id_1,t2.cast_id cast_id_2,count(*) num_movies
from mytable t1
inner join mytable t2 on t2.movie_id = t1.movie_id and t1.cast_id < t2.cast_id
group by t1.cast_id,t2.cast_id
Thives会生成曾经出现在同一部电影中的演员阵容的所有组合,以及电影总数。加入条件t1.cast_id < t2.cast_id
可以避免出现“镜像”记录。
然后可以查询视图。如果您希望成员拥有两部普通电影(实际上未在示例数据中显示...):
select * from myview where num_movies = 2
,
我认为某个程序可能会有所帮助。此存储过程将2个cast_id和num_movies作为输入参数。它选择两个cast_id一起出现的电影中的movie_id。然后根据该数字是否超过num_movies参数:1)返回电影列表(发行日期,导演等),否则返回消息“一起放映两部电影”。
drop proc if exists TwoMovieActors;
go
create proc TwoMovieActors
@cast_id_1 int,@cast_id_2 int,@num_movies int
as
set nocount on;
declare @m table(movie_id int unique not null,rn int not null);
declare @rows int;
with
cast_cte as (
select *,row_number() over (partition by movie_id order by cast_name) rn
from movie_casts mc
where cast_id in(@cast_id_1,@cast_id_2))
insert @m
select movie_id,row_number() over (order by movie_id) rn
from cast_cte
where rn=2
select @rows=@@rowcount;
if @rows<@num_movies
select concat('Were not in ',cast(@num_movies as varchar(11)),' movies together');
else
select m.movie_id,mv.movie_name,mv.release_date,mv.director
from @m m
join movies mv on m.movie_id=mv.movie_id;
要执行它就像
exec TwoMovieActors 1,2,2;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。