Catégories :

Commandes DML - Général

INSERT (multitable)

Met à jour plusieurs tables en insérant une ou plusieurs lignes avec des valeurs de colonnes (à partir d’une requête) dans les tables. Accepte à la fois les insertions inconditionnelles et conditionnelles.

Voir aussi :

INSERT

Dans ce chapitre :

Syntaxe

-- Unconditional multi-table insert
INSERT [ OVERWRITE ] ALL
  intoClause [ ... ]
<subquery>

-- Conditional multi-table insert
INSERT [ OVERWRITE ] { FIRST | ALL }
  { WHEN <condition> THEN intoClause [ ... ] }
  [ ... ]
  [ ELSE intoClause ]
<subquery>

Où :

intoClause ::=
  INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]

Paramètres requis

ALL

Insertion inconditionnelle multitable seulement

Spécifie que chaque ligne exécute chaque clause INTO de l’instruction INSERT.

Note

Si le mot-clé FIRST est spécifié dans une insertion multitable inconditionnelle (ou si le mot-clé ALL n’est pas spécifié), Snowflake retourne une erreur syntaxique.

FIRST ou ALL

Insertion conditionnelle multitable seulement

FIRST

Spécifie que chaque ligne n’exécute que la première clause WHEN pour laquelle la condition est évaluée sur TRUE. Si aucune clause WHEN n’est évaluée sur TRUE, alors la clause ELSE, si elle est présente, s’exécute.

ALL

Spécifie que chaque ligne exécute toutes les clauses WHEN. Si aucune clause WHEN n’est évaluée sur TRUE, alors la clause ELSE, si elle est présente, s’exécute.

Note

  • Une insertion conditionnelle multitable doit contenir au moins une clause WHEN.

  • Chaque clause WHEN peut contenir plusieurs clauses INTO et les clauses INTO peuvent être insérées dans la même table cible.

  • Pour toujours exécuter une clause WHEN, utilisez :

    WHEN 1=1 THEN ...

condition

Insertion conditionnelle multitable seulement

Spécifie la condition qui doit être évaluée sur TRUE pour que les valeurs spécifiées dans la clause INTO soient insérées. La condition peut être une liste SELECT.

table_cible

Spécifie une table cible dans laquelle insérer les lignes. La même table peut être référencée plus d’une fois (dans des clauses WHEN distinctes).

Plusieurs tables peuvent être ciblées en incluant une clause INTO pour chaque table.

sous-requête

Spécifie la liste SELECT qui détermine la source des valeurs à insérer dans les tables cibles.

Paramètres facultatifs

OVERWRITE

Spécifie de tronquer les tables cibles avant de les insérer dans les tables, tout en conservant les privilèges de contrôle d’accès sur les tables.

Les instructions INSERT avec OVERWRITE peuvent être traitées dans le cadre de la transaction en cours, en évitant les instructions DDL qui valident une transaction, telles que :

DROP TABLE t;
CREATE TABLE t AS SELECT * FROM ... ;

Par défaut : Aucune valeur (les tables cibles ne sont pas tronquées avant d’effectuer les insertions)

( nom_col_cible [ , ... ] )

Spécifie une ou plusieurs colonnes de la table cible dans lesquelles les valeurs de la colonne correspondante de la source sont insérées. Le nombre de colonnes cibles spécifié doit correspondre au nombre de valeurs spécifiées dans la source.

Par défaut : Aucune valeur (toutes les colonnes de la table cible sont mises à jour)

VALUES ( nom_colonne_source | DEFAULT | NULL [ , ... ] )

Spécifie une ou plusieurs valeurs à insérer dans les colonnes correspondantes de la table cible. Les valeurs peuvent être :

  • nom_colonne_source : Spécifie la colonne dans la source qui contient la valeur à insérer dans la colonne correspondante de la table cible.

  • DEFAULT: Insère la valeur par défaut de la colonne correspondante dans la table cible.

  • NULL: Insère une valeur NULL.

Chaque valeur de la clause doit être séparée par une virgule. De plus, le nombre de valeurs spécifiées doit correspondre au nombre de colonnes spécifié pour la table cible.

Par défaut : Aucune valeur (les valeurs de toutes les colonnes de la source sont insérées dans les colonnes correspondantes de la table cible)

Notes sur l’utilisation

  • Dans une clause INTO, la clause VALUES est facultative. Si elle est omise, les valeurs de la liste SELECT sont insérées dans la table cible dans leur ordre naturel.

  • Les expressions des clauses WHEN (pour des insertions conditionnelles multitables) et des clauses VALUES ne peuvent faire référence qu’à la sous-requête via un alias. Le pseudonyme doit être l’un des suivants :

    • Alias explicite spécifié pour une expression SELECT.

    • Alias par défaut d’une expression.

    • Alias de position (1 $, 2 $, etc.).

    En outre, les colonnes et les expressions de la sous-requête qui ne figurent pas dans la liste SELECT extérieure ne peuvent pas être référencées dans les clauses WHEN et VALUES. Pour plus de détails, voir Exemples (dans ce chapitre).

Exemples

Insertions inconditionnelles multitables

Insérez chaque ligne dans la table src deux fois dans les tables t1 et t2. Dans cet exemple, les lignes insérées ne sont pas identiques ; chacune des lignes insérées a des valeurs/ordres différents, car nous utilisons la clause VALUES pour varier les données :

INSERT ALL
  INTO t1
  INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT)
  INTO t2 (c1, c2, c3)
  INTO t2 VALUES (n3, n2, n1)
SELECT n1, n2, n3 from src;

-- If t1 and t2 need to be truncated before inserting, OVERWRITE must be specified
INSERT OVERWRITE ALL
  INTO t1
  INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT)
  INTO t2 (c1, c2, c3)
  INTO t2 VALUES (n3, n2, n1)
SELECT n1, n2, n3 from src;

Insertions conditionnelles multitables

Les deux exemples suivants montrent comment créer des insertions conditionnelles multitables en utilisant des clauses WHEN et une clause ELSE pour décider dans quelle(s) table(s), le cas échéant, chaque ligne est insérée.

Ces exemples montrent également la différence entre utiliser INSERT ALL et INSERT FIRST.

Exécutez toutes les clauses WHEN avec une clause ELSE :

  • Les lignes où n1 > 100 satisfont également la condition n1 > 10 et sont donc insérées dans t1 deux fois lorsque le mot-clé ALL est utilisé.

  • Les lignes où n1 <= 10 satisfont le cas ELSE et sont insérées dans t2.

    INSERT ALL
      WHEN n1 > 100 THEN
        INTO t1
      WHEN n1 > 10 THEN
        INTO t1
        INTO t2
      ELSE
        INTO t2
    SELECT n1 from src;
    

Si la table src contient 3 lignes, dans lesquelles n1 a les valeurs 1, 11 et 101, alors après l’instruction INSERT, les tables t1 et t2 contiennent les valeurs indiquées ci-dessous :

t1 :

101

101 > 100, donc la première clause WHEN s’insère dans t1

101

101 > 10, donc la seconde clause WHEN s’insère aussi dans t1

11

11 > 10, donc la seconde clause WHEN s’insère dans t1

La ligne avec n1 = 1 n’est pas insérée dans t1 parce qu’elle ne satisfait à aucune clause WHEN qui s’insère dans t1, et parce que la clause ELSE ne s’insère pas dans t1.

t2 :

101

101 > 10, donc la seconde clause WHEN s’insère dans t2. (La ligne est également admissible pour la clause WHEN n1 > 100 ; toutefois, cette clause n’est pas insérée dans t2.)

11

11 > 10, donc la seconde clause WHEN s’insère dans t2

1

la ligne ne satisfaisait à aucune des clauses WHEN ; elle est donc insérée dans t2 par la clause ELSE

L’exemple suivant est similaire à l’exemple précédent, sauf avec une clause FIRST.

INSERT FIRST
  WHEN n1 > 100 THEN
    INTO t1
  WHEN n1 > 10 THEN
    INTO t1
    INTO t2
  ELSE
    INTO t2
SELECT n1 from src;

Si la table src contient 3 lignes, dans lesquelles n1 a les valeurs 1, 11 et 101, alors après l’instruction INSERT, les tables t1 et t2 contiennent les valeurs indiquées ci-dessous :

t1 :

101

101 > 100, donc la première clause WHEN s’insère dans t1

11

11 > 10, donc la seconde clause WHEN s’insère dans t1

La ligne avec n1 = 1 n’est pas insérée dans t1 parce qu’elle ne satisfait à aucune clause WHEN qui s’insère dans t1, et parce que la clause ELSE ne s’insère pas dans t1.

Contrairement à l’exemple précédent, qui utilisait ALL, la ligne avec n1 = 101 n’est insérée dans t1 qu’une seule fois, car la première WHEN clause est évaluée sur TRUE ; la seconde clause WHEN est ignorée.

t2 :

11

11 > 10, donc la seconde clause WHEN s’insère dans t2

1

la ligne ne satisfaisait à aucune des clauses WHEN ; elle est donc insérée dans t2 par la clause ELSE

La ligne n1 = 101 n’est pas insérée dans t2 parce que 101 est supérieur à 100, donc elle correspond à la première clause WHEN, mais la première clause WHEN ne s’insère pas dans t2, et l’instruction ne vérifie aucune des autres clauses WHEN ou utilise la clause ELSE, car la ligne est déjà admissible pour la première clause WHEN.

Insertions multitables avec alias et références

Insérez des valeurs en utilisant un alias positionnel ($1), un alias explicite (an_alias), et un alias par défaut ("10 + 20") ; cet exemple insère une seule ligne avec des valeurs (1, 50, 30) dans la table t1 :

INSERT ALL
  INTO t1 VALUES ($1, an_alias, "10 + 20")
SELECT 1, 50 AS an_alias, 10 + 20;

Illustrez l’insertion de valeurs à partir de colonnes qui doivent être sélectionnées pour être référencées (b et c dans la table src) :

-- Returns error
  INSERT ALL
    WHEN c > 10 THEN
      INTO t1 (col1, col2) VALUES (a, b)
  SELECT a FROM src;

-- Completes successfully
  INSERT ALL
    WHEN c > 10 THEN
      INTO t1 (col1, col2) VALUES (a, b)
  SELECT a, b, c FROM src;

Illustrez l’insertion de valeurs d’une colonne qui ne peuvent pas être référencées (src1.key) ; au lieu de cela, elle doit être sélectionnée et porter un alias :

-- Returns error
  INSERT ALL
    INTO t1 VALUES (src1.key, a)
  SELECT src1.a AS a
  FROM src1, src2 WHERE src1.key = src2.key;

-- Completes successfully
  INSERT ALL
    INTO t1 VALUES (key, a)
  SELECT src1.key AS key, src1.a AS a
  FROM src1, src2 WHERE src1.key = src2.key;