SQL SUPPRIMER certaines lignes en fonction de comparaisons avec d'autres tables


Exemple

Il est possible de DELETE données d'une table si elles correspondent (ou ne correspondent pas) à certaines données dans d'autres tables.

Supposons que nous voulons DELETE données de la source une fois qu'elles sont chargées dans la cible.

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

Les implémentations les plus courantes des SGBDR (par exemple, MySQL, Oracle, PostgresSQL, Teradata) permettent de joindre des tables lors de DELETE ce qui permet une comparaison plus complexe dans une syntaxe compacte.

En ajoutant de la complexité au scénario d'origine, supposons que Aggregate est créé à partir de Target une fois par jour et ne contient pas le même ID mais contient la même date. Supposons également que nous souhaitons supprimer des données de la source uniquement après que l’agrégat ait été rempli pour la journée.

Sur MySQL, Oracle et Teradata, cela peut être fait en utilisant:

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

Dans PostgreSQL, utilisez:

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

Cela se traduit essentiellement par des jointures internes entre source, cible et agrégat. La suppression est effectuée sur la source lorsque les mêmes identifiants existent dans la cible ET la date présente dans la cible pour ces identifiants existe également dans l'ensemble.

La même requête peut également être écrite (sur MySQL, Oracle, Teradata) en tant que:

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

Les jointures explicites peuvent être mentionnées dans les instructions Delete de certaines implémentations de SGBDR (par exemple, Oracle, MySQL), mais ne sont pas prises en charge sur toutes les plates-formes (par exemple, Teradata ne les prend pas en charge).

Les comparaisons peuvent être conçues pour vérifier les scénarios de non-concordance au lieu de les faire correspondre à tous les styles de syntaxe (observez NOT EXISTS ci-dessous).

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