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 :
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
ouALL
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 clauseWHEN
n’est évaluée sur TRUE, alors la clauseELSE
, si elle est présente, s’exécute.ALL
Spécifie que chaque ligne exécute toutes les clauses
WHEN
. Si aucune clauseWHEN
n’est évaluée sur TRUE, alors la clauseELSE
, 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 clausesINTO
et les clausesINTO
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.target_table
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.subquery
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)
( target_col_name [ , ... ] )
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 ( source_col_name | DEFAULT | NULL [ , ... ] )
Spécifie une ou plusieurs valeurs à insérer dans les colonnes correspondantes de la table cible. Les valeurs peuvent être :
source_col_name
: 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 valeurNULL
.
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 clauseVALUES
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 clausesVALUES
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
etVALUES
. Pour plus de détails, voir Exemples (dans ce chapitre).Dans chaque ligne produite par la
subquery
, la valeur desource_col_name
doit être compatible avec le type de données dutarget_col_name
correspondant. Cette règle s’applique même aux lignes qui seraient filtrées parcondition
dans la clauseWHEN
. L’ordre des opérations ne garantit pas que le filtre de la clauseWHEN
soit appliqué avant que la valeur desource_col_name
soit évaluée pour la compatibilité des types de données.
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 conditionn1 > 10
et sont donc insérées danst1
deux fois lorsque le mot-cléALL
est utilisé.Les lignes où
n1 <= 10
satisfont le casELSE
et sont insérées danst2
.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 |
101 |
101 > 10, donc la seconde clause |
11 |
11 > 10, donc la seconde clause |
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 |
11 |
11 > 10, donc la seconde clause |
1 |
la ligne ne satisfaisait à aucune des clauses |
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 |
11 |
11 > 10, donc la seconde clause |
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 |
1 |
la ligne ne satisfaisait à aucune des clauses |
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;