[英]Get deleted values from 3 tables and put in 1 table
我有三張桌子
最終用戶可以從ASP的下拉列表中選擇top2000jaar,它將其值發送到存儲過程,該存儲過程必須刪除[LIJST]中的所有值,其中top2000jaar等於已選擇的值,但會觸發需要在[LIJST]中不再存在該Songid的情況下從[SONG]中刪除song.songid = lijst.songid的行,因此,如果[artiest]中的藝術家不再有[song]中的歌曲,則該藝術家也應該刪除。
然后將所有已刪除的數據放入[logtable]
我嘗試了一種我認為可行的方法,但沒有成功。
預期輸出應為:
<-2013年12月31日是錯字,是2013年
這是觸發器的創建,我在google上找到了一些答案,但是不起作用:
ALTER TRIGGER [dbo].[TRGremoveSong]
ON [dbo].[Lijst]
AFTER DELETE AS
Begin
DELETE FROM song where songid not in (Select songid from lijst)
END
begin
INSERT INTO logtable
SELECT
*
FROM deleted
end
我相信使用它作為觸發器應該可以完成這項工作,這只會填充實際已刪除的內容,因此,如果尚未刪除附庸風雅的歌曲,則在歌曲等旁邊將顯示為空。
ALTER TRIGGER [dbo].[TRGremoveSong]
ON [dbo].[Lijst]
AFTER DELETE AS
Begin
INSERT INTO logtable
SELECT sng.titel, art.naam, sng.jaar, positie, top2000jaar
FROM deleted d
Outer Apply
(Select titel, jaar, artiestid from song where not exists (Select * from lijst where songid = d.songid) and songid = d.songid) sng
Outer Apply
(Select naam from artiest where not exists (Select * from song where artiestid = sng.artiestid and songid <> d.songid) and artiestid = sng.artiestid) art
DELETE FROM song s where not exists (Select * from lijst where songid = s.songid)
DELETE FROM artiest a where not exists (Select * from song where artiestid = a.artiestid)
End
這是一個示例SQLFiddle,其中刪除了歌曲9,這是該藝術家的最后一首歌曲: http ://sqlfiddle.com/#!6/4405b/1/0
下面將顯示刪除時的所有字段:
ALTER TRIGGER [dbo].[TRGremoveSong]
ON [dbo].[Lijst]
AFTER DELETE AS
Begin
INSERT INTO logtable
SELECT sng.titel, art.naam, sng.jaar, positie, top2000jaar
FROM deleted d
Outer Apply
(Select titel, jaar, artiestid from song where songid = d.songid) sng
Outer Apply
(Select naam from artiest where artiestid = sng.artiestid) art
DELETE FROM song s where not exists (Select * from lijst where songid = s.songid)
DELETE FROM artiest a where not exists (Select * from song where artiestid = a.artiestid)
End
這是用於此的SQLFiddle: http ://sqlfiddle.com/#!6/fd6171/1/0
您只需將邏輯添加到存儲過程即可完成所有操作,如下所示:
DECLARE @LIJSTID_TO_DELETE INT = 123
DECLARE @SongID INT
DECLARE @ArtistID INT
-- SET the songid for the row you're going to delete
SELECT @SongID = songid
FROM LIJST
WHERE top2000jaar = @LIJSTID_TO_DELETE
-- first deletion
DELETE FROM LIJST
WHERE top2000jaar = @LIJSTID_TO_DELETE
IF @@ROWCOUNT > 0
INSERT INTO LOGTABLE.... -- deleted LIJST values
-- set the artist id for the song you are going to delete
SELECT @ArtistID = artiestid
FROM Song
WHERE songid = @SongID
-- delete the linked song (could use cascade delete if required)
DELETE FROM Song
WHERE songid = @SongID
IF @@ROWCOUNT > 0
INSERT INTO LOGTABLE.... -- deleted song values
-- Delete the artist if their songs no longer exist
IF NOT EXISTS (SELECT * FROM Song WHERE artiestid = ArtistID )
BEGIN
DELETE FROM Artiest
WHERE artiestid = @ArtistID
IF @@ROWCOUNT > 0
INSERT INTO LOGTABLE.... -- deleted artiest values
END
@@ROWCOUNT
僅返回受前一條語句影響的行數,因此僅在刪除行時才會記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.