2010-12-01 4 views
3

Ce qui rend ma situation difficile, c'est que je n'ai pas une seule clé de colonne, avec une simple liste de clés primaires à supprimer (par exemple, "supprimer de la table où entrer ([liste])"). J'ai plusieurs colonnes ensemble comme clé primaire et je devrais me joindre à chacune d'entre elles.Comment supprimer des lignes d'une table Teradata qui ne se trouvent pas dans une autre table?

En utilisant ce que je connais d'autres bases de données, je pensais que cela pourrait se faire comme:

DELETE FROM 
    table1 t1 
    LEFT OUTER JOIN 
     table2 t2 
    ON 
     t2.key1 = t1.key1 AND 
     t2.key2 = t1.key2 
    WHERE 
    t2.key1 IS NULL; 

Mais Teradata (v12) répond avec le numéro d'erreur 3706, en disant « Erreur de syntaxe: les tables jointes ne sont pas autorisés dans FROM clause."

Répondre

7

Trouvée cela se fait par:

DELETE FROM 
    table1 
    WHERE 
    (key1, key2) NOT IN (
     SELECT UNIQUE key1, key2 FROM table2 
    ); 
2

Une autre façon est d'utiliser une sous-requête corrélative:

Delete From Table1 
Where Not Exists(
       Select 1 
       From Table2 
       Where Table2.key1 = Table1.key1 
        And Table2.key2 = Table1.key2 
       ) 
+0

Est-ce que cette offre tout avantage de performance sur la réponse que je fournis? –

+0

@Paul Hooper - La seule façon de savoir avec certitude est d'analyser le plan d'exécution et de faire quelques tests. Si Table2 est significativement plus grande et comporte plusieurs lignes pour chaque ligne correspondante de Table1, elle peut être plus performante car elle peut arrêter le processus de recherche du premier élément. – Thomas

Questions connexes