Sql-Server

T-SQL 檢查另一個表行,如果匹配刪除它們

  • November 25, 2015

我正在 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 值。

引用自:https://dba.stackexchange.com/questions/122051