我有三张桌子,Movie,MovieRole和Actor。MovieRole是许多涉及电影和演员的表,但它也定义了演员在表上的角色。由于演员可以在电影中有多个角色,所以MovieRole是一个有3列的表:
MovieId int
ActorId int
RoleName varchar(100)我们没有对MovieId和ActorId有唯一的约束,而是跨越了所有三个字段。所以不可能有埃迪·墨菲在其中扮演同样的角色。但是,如果艾迪·墨菲扮演不同的角色,他可以两次出演同一部电影(“克伦教授”、“野性教授”中的“兄弟之爱”)。
问题是我们在表Actor中有很多副本。因此,可能有一个参与者叫“爱德华·墨菲”,另一个人叫“埃迪·墨菲”,这两个人都可以和“克伦普教授”一起出演同一部电影。“爱德华·墨菲”可能与“诺比特”有关,而不是“来到美国”,反之亦然,“埃迪·墨菲”。
我需要创建一个存储过程,将演员和他们的电影角色关联合并在一起。它应该做的是发送两个参与者it,一个是主参与者记录,另一个是删除。预定删除演员中的电影角色关联必须与主演员相关联。
我所拥有的存储过程只有在预定的删除角色与主参与者没有任何角色冲突时才能工作。所以,如果s演员在B电影中,而主演员在A电影中,那么效果很好。或者,如果这位s-f-d演员是在电影A中,但有一个不同的角色,我们都很好。但如果两个演员都在同一部电影中扮演同样的角色,我就会遇到这样的限制。
如何构造解决该意外情况的查询或存储过程?我一直在寻找方法来完成这个任务,虽然每个人都说只要有可能就避免使用游标,但是使用光标似乎就能做到这一点。有没有一种不用游标就能完成我想要的东西的方法?
目前,sproc的基本要点如下:
alter procedure RoleMerge @ActorA int, @ActorB int as
update MovieRole set ActorId=@ActorA where ActorId=@ActorB
delete from Actor where Id=@ActorB发布于 2013-09-18 19:24:06
首先,如果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发布于 2013-09-18 19:18:17
你不需要光标。MovieID的where中的附加子句。就像这样:
update MovieRole set ActorId=@ActorA where ActorId=@ActorB
  and MovieID not in (select MovieID from MovieRole where ActorId=@ActorA)希望这能帮上忙
编辑:
我终于把这件事做好了:)。我注意到它已经得到了回答,但万一有人对替代解决方案感兴趣:)。以下是我想出的:
update a set a.ActorId = b.ActorId
from MovieRole a
left join MovieRole b
    on a.MovieId = b.MovieId and a.ActorID = @ActorB and b.ActorID = @ActorA
where a.RoleName <> b.RoleNamehttps://stackoverflow.com/questions/18880261
复制相似问题