簡體   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