Sql-Server
T-SQL 檢查另一個表行,如果匹配刪除它們
我正在 SSIS 中創建一個腳本,我想在其中
table A
檢查行是否存在於table B
. 如果它們存在,則必須將其刪除。
Table A
是一個名為的存檔表Customer_archive
Table B
是一個會經常更新的表,名為Customer_Information
.這個想法是,一旦將一行儲存在 中
Customer_archive
,該行將不會出現在 中Customer_information
,即使在Customer_information
已更新之後也是如此。它必須檢查整行而不是 WHERE = ‘something’。
是否可以做一個
WHERE
由 2 列組合而成的子句?
我不能說關於 SSIS 的任何內容,但在 SQL 中,您可以檢查整行是否與另一行相同(包括檢查
NULL
可能會變得相當複雜的值),使用這種技術,@PaulWhite 在他的部落格文章中解釋:未記錄的查詢計劃:平等比較。例如在你的情況下。“對於表 B 和表 A 的任何相同行,刪除那些 B 行”:
DELETE b -- from table B: Customer_information FROM Customer_archive AS a JOIN Customer_information AS b ON a.pk = b.pk WHERE EXISTS (SELECT a.* INTERSECT SELECT b.*) ;
當表很大時,我對效率有嚴重的擔憂——根據定義,存檔表會很大。
a.pk = b.pk
確實不需要,因為 pk 列顯然包含在行檢查中,但EXISTS
我保留它們是為了提高效率。假設兩個表具有相同的主鍵,並且在一段時間後,大部分歸檔行已經從表 B 中刪除,PK 索引將具有非常少的匹配值,因此連接會相對較快 - 並使用該行僅檢查匹配的 pk 值。