我有 3 张桌子、Movie
、MovieRole
和Actor
。MovieRole
是一个多对多表,将电影和演员联系起来,但它也定义了演员在桌子上的角色。因为演员可能在一部电影中扮演多个角色,MovieRole
所以是一个包含 3 列的表:
MovieId int
ActorId int
RoleName varchar(100)
MovieId
我们没有对和有唯一约束,ActorId
而是在所有三个字段中都有它。所以不可能有一部电影里埃迪墨菲在里面并且扮演同样的角色。但是,如果埃迪·墨菲扮演不同的角色(“Klump 教授”、“疯子教授”中的“Buddy Love”),他可以将同一部电影关联两次。
问题是我们在 table 中有很多重复项Actor
。因此,可能有一个名为“Edward Murphy”的参与者和另一个名为“Eddie Murphy”的参与者,并且他们都可能与“Professor Klump”相关联。而“爱德华墨菲”可能与“诺比特”相关联,但与“来到美国”无关,反之亦然“艾迪墨菲”。
我需要创建一个将演员及其电影角色关联合并在一起的存储过程。它应该做的是发送两个演员 ID,一个是主要演员记录,一个是要删除的。预定删除演员中的电影角色关联必须与主要演员相关联。
我的存储过程仅在 slated-for-delete 演员与主要演员没有任何角色冲突时才有效。因此,如果 sfd 演员在电影 B 中,而主要演员在电影 A 中,则效果很好。或者如果 sfd 演员在电影 A 中但扮演不同的角色,我们都很好。但如果两位演员在同一部电影中扮演相同的角色,我就会遇到这种限制。
如何构建一个查询或存储过程来解决该意外事件?我一直在寻找完成这项工作的方法,似乎使用游标可以做到这一点,尽管每个人都说尽可能避免使用游标。有没有办法在不使用光标的情况下完成我想要的?
现在,sproc 的基本要点是这样的:
alter procedure RoleMerge @ActorA int, @ActorB int as
update MovieRole set ActorId=@ActorA where ActorId=@ActorB
delete from Actor where Id=@ActorB