gpt4 book ai didi

sql - 我需要游标来在 SQL 中完成这项工作吗?

转载 作者:行者123 更新时间:2023-12-03 00:34:09 27 4
gpt4 key购买 nike

我有 3 个表:MovieMovieRoleActorMovieRole 是一个将电影和 Actor 关联起来的多对多表,但它也定义了 Actor 在表中所扮演的角色。由于 Actor 可能在一部电影中扮演多个角色,因此 MovieRole 是一个包含 3 列的表:

MovieId int
ActorId int
RoleName varchar(100)

我们不再仅对 MovieIdActorId 进行唯一约束,而是在所有三个字段中都有它。所以不可能有一部电影有艾迪·墨菲在其中并且扮演同样的角色。但如果艾迪·墨菲扮演不同的角色,他可以两次与同一部电影相关联(“克伦普教授”、“疯狂教授”中的“巴迪·爱”)。

问题是表 Actor 中有很多重复项。因此,可能会有一个名为“Edward Murphy”的参与者和另一个名为“Eddie Murphy”的参与者,并且他们两人都可能与“克伦普教授”属于同一部电影。 “Edward Murphy”可能与“Norbit”相关,但与“Coming to America”无关,反之亦然。

我需要创建一个存储过程,将 Actor 及其电影角色关联合并在一起。它应该做的是发送两个参与者 ID,一个是主要参与者记录,另一个将被删除。预定删除的 Actor 中的电影角色关联必须与主要 Actor 相关联。

我的存储过程仅在预定删除的参与者与主要参与者没有任何角色冲突时才有效。因此,如果科幻 Actor 在电影 B 中,主要 Actor 在电影 A 中,效果就很好。或者,如果科幻 Actor 出现在电影 A 中,但扮演不同的角色,我们都很好。但如果两个 Actor 在同一部电影中扮演相同的角色,我就会遇到这种限制。

如何构造一个查询或存储过程来解决这种意外情况?我一直在寻找完成此任务的方法,尽管每个人都说尽可能避免使用游标,但似乎使用游标就可以做到这一点。有没有办法在不使用光标的情况下完成我想要的事情?

现在,存储过程的基本要点是这样的:

alter procedure RoleMerge @ActorA int, @ActorB int as

update MovieRole set ActorId=@ActorA where ActorId=@ActorB

delete from Actor where Id=@ActorB

最佳答案

首先,如果 ActorId@ActorB 更改为 @ActorA,则删除违反约束的行:

alter procedure RoleMerge @ActorA int, @ActorB int as
begin
delete MovieRole
from MovieRole as M
where
ActorId = @ActorB and
exists (
select *
from MovieRole as M1
where
M1.ActorId = @ActorA and M1.MovieId = M.MovieId and
M1.RoleName = M.RoleName
)

update MovieRole set ActorId = @ActorA where ActorId = @ActorB

delete from Actor where Id = @ActorB
end

关于sql - 我需要游标来在 SQL 中完成这项工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com