Sql server 删除带有奇数参数的触发器,其中参数为';行不通

Sql server 删除带有奇数参数的触发器,其中参数为';行不通,sql-server,triggers,sql-delete,Sql Server,Triggers,Sql Delete,本质上,我想在团队中添加一名新球员后,删除前一名球员。我试着模仿我在这里发现的一些东西,但似乎不起作用,这就是为什么我要提出这个问题。我想这可能与我的复杂where子句有关 删除的条件是,它应该是相同的角色、相同的团队,但ID不同。与插入的播放机不同 create or alter trigger retire2 on Players after insert as begin delete p from players p join inserted i on p.playerid=i

本质上,我想在团队中添加一名新球员后,删除前一名球员。我试着模仿我在这里发现的一些东西,但似乎不起作用,这就是为什么我要提出这个问题。我想这可能与我的复杂where子句有关

删除的条件是,它应该是相同的角色、相同的团队,但ID不同。与插入的播放机不同

create or alter trigger retire2
on Players
after insert
as

begin

delete p 
from players p join inserted i

on p.playerid=i.playerid

where (p.TeamID=i.TeamID and
p.Role=i.Role and
p.PlayerID!=i.PlayerID);

end

go

问题是您在和p.playerid!=i、 在您的
WHERE
中使用PlayerID子句,并定义两者都必须为true。为什么有些东西不等于某些东西,同时又等于某些东西(忽略量子物理)

我怀疑你真正想要的是:

CREATE OR ALTER TRIGGER retire2
ON dbo.Players
AFTER INSERT
AS
BEGIN

    DELETE P
    FROM dbo.Players P
    WHERE EXISTS (SELECT 1
                  FROM inserted i
                  WHERE i.TeamID = P.TeamID
                    AND i.[Role] = P.[Role]
                    AND i.PlayerID != P.PlayerID);

END;

p.playerid=i.playerid上的
。。。还有p.PlayerID!=i、 PlayerID
这两条语句怎么可能都是真的?但您的模式在逻辑上已经存在缺陷。球队和球员是不同的实体。你把它们弄成了一个。角色也可能是不同的实体。你还做出了另一个最终可能成为问题的假设——“先前的玩家”没有定义。