根據與其他表的比較刪除某些行
如果表中的資料與其他表中的某些資料匹配(或不匹配),則可以從表中獲取資料。
讓我們假設我們想要從 Source 載入到 Target 後來自 Source 的 DELETE
data。
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 )