繁体   English   中英

从3个表中获取已删除的值并放入1个表中

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM