在mssql中同时删除和更新
Delete and Update in same time in mssql
我在 mssql 服务器上有一份 deleting.But 的工作,我希望在删除之前更新另一个 table。
我有两个 table,由 "user_id" 列连接,我的 table 的名字是 "UserInfo" 和 "AdvertInfo",它们与 user_id 列连接.我将在 7 天后删除 giving_advert_day。但是当它被删除时,我想增加 (+1) user_advert_number 列。如果在 user_id 中删除,从 table 中删除 3 或 4 等数据,那么来自它们的连接数据将增加 +3、+4 或蚀刻。有办法吗?
这是我的删除命令
Delete from AdvertInfo where advert_id In (
select advert_id from AdvertInfo
where advert_begin_date < DATEADD(day, -7, GETDATE()))
您可以 UPDATE
与 JOIN
:
UPDATE u
SET u.user_advert_number = u.user_advert_number + 1
FROM UserInfo as u
INNER JOIN AdvertInfo AS a ON u.user_id = a.user_id
WHERE a.advert_begin_date < DATEADD(day, -7, GETDATE()))
顺便说一句,你的 delete 子句可以这样写:
Delete
from AdvertInfo
where advert_begin_date < DATEADD(day, -7, GETDATE()))
不需要 IN
谓词。
您还可以创建一个 create a trigger,以执行 after delete
,例如以您想要的方式更新列。
使用下面的查询来实现你想要的:
DECLARE @Temp TABLE (
[user_id] INT
)
DELETE i
OUTPUT deleted.[user_id] INTO @Temp
FROM AdvertInfo i
WHERE advert_begin_date < DATEADD(day, -7, GETDATE())
UPDATE u
SET u.user_advert_number = u.user_advert_number + d.cnt
FROM UserInfo as u
INNER JOIN (
SELECT [user_id], COUNT([user_id]) AS cnt
FROM @Temp
GROUP BY [user_id]
) d ON d.[user_id] = u.[user_id]
Merhaba Kaya,
也许你可以使用 SQL OUTPUT clause 如下
您可能已经知道,在执行 DELETE 命令时,您可以使用 OUTPUT 子句将受影响的数据放入变量 table 并且正如您在以下示例中看到的那样,您可以稍后使用它
DECLARE @Deleted table (
user_id int
);
DELETE FROM AdvertInfo
OUTPUT DELETED.user_id
INTO @Deleted
WHERE advert_begin_date < DATEADD(day, -7, GETDATE())
update u
set user_advert_number = isnull(user_advert_number,0) + 1
from UserInfo as u
inner join @Deleted d on d.user_id = u.user_id
我在 mssql 服务器上有一份 deleting.But 的工作,我希望在删除之前更新另一个 table。 我有两个 table,由 "user_id" 列连接,我的 table 的名字是 "UserInfo" 和 "AdvertInfo",它们与 user_id 列连接.我将在 7 天后删除 giving_advert_day。但是当它被删除时,我想增加 (+1) user_advert_number 列。如果在 user_id 中删除,从 table 中删除 3 或 4 等数据,那么来自它们的连接数据将增加 +3、+4 或蚀刻。有办法吗? 这是我的删除命令
Delete from AdvertInfo where advert_id In (
select advert_id from AdvertInfo
where advert_begin_date < DATEADD(day, -7, GETDATE()))
您可以 UPDATE
与 JOIN
:
UPDATE u
SET u.user_advert_number = u.user_advert_number + 1
FROM UserInfo as u
INNER JOIN AdvertInfo AS a ON u.user_id = a.user_id
WHERE a.advert_begin_date < DATEADD(day, -7, GETDATE()))
顺便说一句,你的 delete 子句可以这样写:
Delete
from AdvertInfo
where advert_begin_date < DATEADD(day, -7, GETDATE()))
不需要 IN
谓词。
您还可以创建一个 create a trigger,以执行 after delete
,例如以您想要的方式更新列。
使用下面的查询来实现你想要的:
DECLARE @Temp TABLE (
[user_id] INT
)
DELETE i
OUTPUT deleted.[user_id] INTO @Temp
FROM AdvertInfo i
WHERE advert_begin_date < DATEADD(day, -7, GETDATE())
UPDATE u
SET u.user_advert_number = u.user_advert_number + d.cnt
FROM UserInfo as u
INNER JOIN (
SELECT [user_id], COUNT([user_id]) AS cnt
FROM @Temp
GROUP BY [user_id]
) d ON d.[user_id] = u.[user_id]
Merhaba Kaya, 也许你可以使用 SQL OUTPUT clause 如下 您可能已经知道,在执行 DELETE 命令时,您可以使用 OUTPUT 子句将受影响的数据放入变量 table 并且正如您在以下示例中看到的那样,您可以稍后使用它
DECLARE @Deleted table (
user_id int
);
DELETE FROM AdvertInfo
OUTPUT DELETED.user_id
INTO @Deleted
WHERE advert_begin_date < DATEADD(day, -7, GETDATE())
update u
set user_advert_number = isnull(user_advert_number,0) + 1
from UserInfo as u
inner join @Deleted d on d.user_id = u.user_id