2016-08-12 32 views
0

我有一張表和同一張表的備份。備份後在主表中插入一些數據。現在我想從主表中刪除數據。如何實現它? 讓說表是帶有AuthorID,BookName,BookID列的'BookMap'。取得'BookMap'表的備份並插入新數據。現在要刪除這些數據。從表中刪除不匹配的數據

注意:我在這裏沒有主鍵。

+2

編輯你的問題,並提供樣本數據和預期的結果。 –

+0

您可以使用MERGE和WHEN MATCHED DELETE;在這裏檢查:https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx – scsimon

+0

@scsimon:合併語句需要主鍵 –

回答

1

如果你想BookMap看起來就像backup_BookMap,那麼你可以考慮:

truncate table bookmap; 

insert into bookmap(. . .) 
    select . . . 
    from backup_bookmap; 
+0

您的回答非常好。我很複雜 – StackUser

+0

@戈登Linoff,簡單,優秀的答案, – user1926138

1

如果我理解正確的,你想從你非備份表中刪除數據,有被插入到備份表:

DELETE nonbackup 
FROM BookMap as nonbackup 
WHERE nonbackup.BookID IN 
(
    SELECT BookID 
    FROM BookMapBackup as backup 
) 
+0

我認爲你的邏輯是不正確的。我不能刪除數據只採用BookID作爲過濾器:( – user1926138

1

嘗試這樣,

DELETE B FROM bookmark B INNER JOIN 
(
SELECT *FROM (
select *From bookmark 
except 
select *From bookmarkbackup)T 
)T1 ON T1.AuthorID=B.AuthorID 
AND T1.BookName=B.BookName 
AND T1.BookID=B.BookID 
+0

優秀的解決方案 – user1926138

0

下面是一些你可以測試:

DECLARE @book table 
(
    AuthorID varchar, 
    BookName varchar(255), 
    BookID int 
); 

DECLARE @backupBook table 
(
    AuthorID varchar, 
    BookName varchar(255), 
    BookID int 
); 

insert into @book values(1, 'book1', 1) 
insert into @book values(2, 'book2', 2) 
insert into @book values(3, 'book3', 3) 

insert into @backupBook values(1, 'book1', 1) 
insert into @backupBook values(2, 'book2', 2) 

select * from @book 
select * from @backupBook 

delete a 
from @book a 
INNER JOIN @backupBook b 
    ON a.AuthorID = b.AuthorID 
    and a.BookName = b.BookName 
    and a.BookID = b.BookID 

select * from @book 
select * from @backupBook 
+0

內部聯接使得您可以刪除基於內部聯接參數在兩個表中找到的所有行 – Frog

+0

它將刪除主表中的所有行 – user1926138

+0

尊敬的用戶1926138複製粘貼並嘗試;) 書3保留在@book表中,而書1和2被刪除 – Frog