在我的网站上,我会显示一个名单及其评论数量列表。我这样做:
select *
from names, (select count(id) from comments where nid = names.id) comment_count
现在我想在我的名字表中添加一个comment_count
列,并省略检索计数。因为每个评论都需要确认,并且我的确认命令要么删除评论(如果不合适),要么将其确认的标志更新为1,我正在尝试这样做:
create trigger change_comment_count
on comments after update,delete
as
if exists(select id from deleted)
update names
set comment_count = (select count(id)
from comments
where nid in (select nid from deleted d)
and confirmed = 1)
where id = d.nid
else
if exists(select id from updated)
update names
set comment_count = (select count(id)
from comments
where nid in (select nid from deleted d)
and confirmed = 1)
where id = d.nid
但是我收到了一个错误:
无法绑定多部分标识符“d.nid”。
答案 0 :(得分:1)
首先 - SQL Server中没有updated
伪表;对于UPDATE
操作,deleted
将包含旧值,而Inserted
将包含新值。
其次:在这两种情况下,您都 在deleted AS d
语句中引用UPDATE
- 当然,您无法引用d.nid
- 那里该范围内没有别名d
由于在DELETE
和UPDATE
两种情况下,您将在Deleted
伪表中有条目,这就是您需要查看的所有条目 - {中的所有受影响的行{1}}表需要更新。
尝试这样的事情:
dbo.Names
所以我只是在CREATE TRIGGER change_comment_count
ON dbo.Comments
AFTER UPDATE,DELETE
AS
UPDATE dbo.Names
SET comment_count = (SELECT COUNT(c.id)
FROM dbo.Comments c
INNER JOIN Deleted d ON c.nid = d.nid
WHERE c.confirmed = 1)
FROM deleted d
WHERE dbo.Names.id = d.nid
和INNER JOIN
表之间执行了dbo.Names
,它为我提供了Deleted
中所有已更新或删除的行。
dbo.Names
也可以通过在COUNT(id)
表和INNER JOIN
伪表之间使用dbo.Comments
来简化。