我有一个中间表,用于定义例如Customer
和Orders
之间的多对多关系,如下所示:
USE [master]
GO
CREATE DATABASE Example
GO
USE [Example]
GO
CREATE TABLE [dbo].[CustomerOrders](
[CustomerId] [int],
[OrderId] [int]
)
GO
INSERT INTO CustomerOrders (CustomerId, OrderId) VALUES (1, 1)
INSERT INTO CustomerOrders (CustomerId, OrderId) VALUES (1, 2)
INSERT INTO CustomerOrders (CustomerId, OrderId) VALUES (2, 1)
GO
CREATE TRIGGER [dbo].[CustomerOrdersRemoved]
ON [dbo].[CustomerOrders]
FOR DELETE
AS
BEGIN
SET NOCOUNT ON;
--IF NOT EXISTS (SELECT CustomerId FROM CustomerOrders
INNER JOIN deleted ON CustomerOrders.CustomerId=deleted.CustomerId)
--this wont work
END
GO
DELETE CustomerOrders WHERE OrderId=1
GO
现在,我需要在此表上有一个ON DELETE
触发器,需要根据不在表中留下任何订单的客户更新另一个表。在这种情况下,DELETE
操作后,CustomerId=1
的客户将有1个订单,剩余OrderId=2
,而CustomerId=2
的客户将没有订单。因此,我只需要从触发器中的已删除 CustomerId=2
中获取vtable
的客户。
我该如何做到这一点?
答案 0 :(得分:1)
问题是您在比较的右侧使用了deleted.CustomerId。
我正在做与你正在做的事情类似的事情。
,解决方案是定义一个@variable来保存deleted.CustomerId(在你的SET NO COUNT行之后),然后将CustomerOrders.CustomerId与变量进行比较。
编辑: 这里的代码工作正常,它是一个触发器来更新电影评级,它来自tblRating(MovieID,UserID,rating)的平均评级,它也代表tblMovies和tblUsers之间的多对多关系,这个使用插入但它与删除相同:
CREATE TRIGGER trUpdateRating
ON [dbo].[tblRating]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @rate float, @mid int
SET @rate = 0;
-- here is the assignment I was talking about and it is valid
SELECT @mid=MovieID from inserted;
SELECT @rate=AVG(isnull(Rating, 0)) FROM tblRating WHERE MovieID=@mid;
-- and here is the comparison
UPDATE tblMovies
SET avg_rating = @rate
WHERE ID=@mid;
END
答案 1 :(得分:0)
我的手比我的头快: - /
答案是
SELECT CustomerId FROM deleted WHERE CustomerId NOT IN (SELECT CustomerId FROM CustomerOrders)