2017-12-27 215 views
0

我在mssql服務器上有一個工作要刪除。但我希望在刪除之前更新另一個表。 我有兩個通過「user_id」列連接的表,我的表名是「UserInfo」和「AdvertInfo」,它們與user_id列連接。我正在刪除7天后的giving_advert_day。但是當它被刪除時,我想增加(+1)user_advert_number列。如果在user_id中刪除,從表中刪除3或4等數據,則從它們連接的數據將增加+3,+4或蝕刻。有沒有辦法呢? 這裏是我的刪除命令在mssql中同時刪除和更新

Delete from AdvertInfo where advert_id In (
select advert_id from AdvertInfo 
where advert_begin_date < DATEADD(day, -7, GETDATE())) 
+1

您看過觸發器嗎? –

+0

您可以使用此表中的觸發器在更新後自動刪除。 –

+0

我沒有關於觸發器的信息,所以我無法做到這一點。 – KAYA

回答

2

您可以UPDATEJOIN

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 
from AdvertInfo 
where advert_begin_date < DATEADD(day, -7, GETDATE())) 

沒有必要的IN謂詞。


您還可以創建一個create a trigger,以執行after delete例如更新列你想要的方式。

+0

非常感謝。這將是同一時間在SQL Server代理作業?並且必須更新廣告中的刪除時間。 – KAYA

+0

@KAYA - 是的,你可以在現在有問題的工作中使用它,並且你可以在兩個人之後使用這兩個查詢,但在這種情況下觸發器將是首選。 – 2017-12-27 13:47:23

1

使用下面的查詢來實現你想要的:

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] 
1

Merhaba卡亞, 也許你可以使用SQL OUTPUT clause如下 你可能已經知道,在執行刪除命令你可以得到OUTPUT子句受影響的數據到一個變量表中,並且您可以在以下示例中看到,您可以稍後使用它

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 
+0

非常感謝。它爲我工作.. – KAYA