[英]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.