根據與其他表的比較刪除某些行

如果表中的資料與其他表中的某些資料匹配(或不匹配),則可以從表中獲取資料。

讓我們假設我們想要從 Source 載入到 Target 後來自 Source 的 DELETEdata。

DELETE FROM Source
WHERE  EXISTS ( SELECT 1 -- specific value in SELECT doesn't matter
               FROM Target
               Where Source.ID = Target.ID )

最常見的 RDBMS 實現(例如 MySQL,Oracle,PostgresSQL,Teradata)允許在 DELETE 期間連線表,從而允許在緊湊語法中進行更復雜的比較。

增加原始場景的複雜性,我們假設 Aggregate 每天從 Target 構建一次,並且不包含相同的 ID,但包含相同的日期。讓我們也假設我們要刪除的源資料只是彙總填充的一天後。

在 MySQL,Oracle 和 Teradata 上,可以使用以下方法完成:

DELETE FROM Source
WHERE  Source.ID = TargetSchema.Target.ID
       AND TargetSchema.Target.Date = AggregateSchema.Aggregate.Date

在 PostgreSQL 中使用:

DELETE FROM Source
USING  TargetSchema.Target, AggregateSchema.Aggregate
WHERE  Source.ID = TargetSchema.Target.ID
       AND TargetSchema.Target.DataDate = AggregateSchema.Aggregate.AggDate

這實質上導致 Source,Target 和 Aggregate 之間的 INNER JOIN。當目標中存在相同的 ID 時,將在源上執行刪除,並且這些 ID 中存在的日期也存在於聚合中。

也可以編寫相同的查詢(在 MySQL,Oracle,Teradata 上):

DELETE Source
FROM   Source, TargetSchema.Target, AggregateSchema.Aggregate
WHERE  Source.ID = TargetSchema.Target.ID
       AND TargetSchema.Target.DataDate = AggregateSchema.Aggregate.AggDate

在一些 RDBMS 實現(例如 Oracle,MySQL)的 Delete 語句中可能會提到顯式連線,但在所有平臺上都不支援(例如 Teradata 不支援它們)

比較可以設計為檢查不匹配的情況,而不是匹配所有語法樣式的情況(請參閱下面的 NOT EXISTS

DELETE FROM Source
WHERE NOT EXISTS ( SELECT 1 -- specific value in SELECT doesn't matter
               FROM Target
               Where Source.ID = Target.ID )