Aide mémoire sur les instructions INSERT en SQL.

Exemple utilisé

Considérons les quatre tables EMPLOYE, PROJET, DEPARTEMENT et ACTIVITES. Elles nous serviront d’exemple tout au long de cet article.

[[L’exemple est extrait de la documentation en anglais d’IBM.]]

Règles de gestion :

 Chaque employé figure dans la table EMPLOYE.

 Un employé responsable d’un projet figure dans la table PROJET.

 Un employé fait partie d’un département.

 La liste des départements se trouve dans la table DEPARTEMENT.

 La table ACTIVITES contient une liste des activités assurées par le CE de l’entreprise.

Table des employés

EMPLOYE,
EMPNO, numéro de l'employé
LASTNAME, nom de l'employé
WORKDEPT, département ou travail l'employé

EMPNO LASTNAME WORKDEPT
000020 THOMPSON 000001
000060 STERN 000002
000100 SPENSER 000003
000170 YOSHIMURA 000002
000180 SCOUTTEN 000002
000190 WALKER 000002
000250 SMITH 000004
000280 SCHNEIDER 000005
000300 SMITH 000005
000310 SETRIGHT 000005

Table des employés responsable d’un projet

PROJET,
RESPEMP, numéro de l'employé responsable du projet
PROJNO, numéro du projet

RESPEMP PROJNO
000020 PL2100
000060 MA2110
000100 OP2010
000250 AD3112

Table des départements

DEPARTEMENT,
DEPTNO, numéro de département
DEPTNAME, Nom du département

DEPTNO DEPTNAME
000001 PLANNING
000002 MANUFACTURING SYSTEMS
000003 SOFTWARE SUPPORT
000004 ADMINISTRATION SYSTEMS
000005 OPERATIONS

Table des activités du CE

ACTIVITES,
ACTINAME, Nom activités

ACTINAME
TENNIS
CINEMA
COURS DE LANGUE

Insertion de valeurs constantes dans une table.

Insertion d’un nouvel employé dans la table EMPLOYE avec chacun des champs alimentés par des constantes.


INSERT INTO EMPLOYE
VALUES
(
00400 ,
'DUPONT' ,
'000002'
)

Il est bien sur possible d’alimenter les champs à  partir de variable ‘hote’, comme dans l’exemple ADELIA ci dessous


WRKDEPT = '000002'
DEBUT_SQL
+ INSERT INTO EMPLOYE
+ VALUES (
+ 00400 ,
+ 'DUPONT' ,
+ :WRKDEPT
+ )
FIN_SQL

Insertion de valeurs issues d’un SELECT dans une table.

Soit une table temporaire de structure suivante :


TMP_001,
COD001, numéro de l'employé
LIB001, nom de l'employé

Insertion via une requête avec select simple :

La requête suivante insert tous les couples code employé / nom employé de la table EMPLOYE dans la table temporaire TMP_001

INSERT INTO TMP_001
(
SELECT A.EMPNO,A.LASTNAME
FROM EMPLOYE A
)

L’exemple ADELIA ci dessous, fait la même chose :


DEBUT_SQL
+ INSERT INTO TMP_001
+ (
+ SELECT A.EMPNO,A.LASTNAME
+ FROM EMPLOYE A
+ )
FIN_SQL

La requête select est simple dans l’exemple précédent. Mais vous pouvez la rendre aussi compliquée que votre besoin l’exige.

Insertion via une requête avec select complexe :

Dans cet exemple, la requête insère dans une table temporaire TMP_002 déjà  créée, le résultat d’un select relativement complexe avec jointures entre 3 tables (articles, stock articles et mouvements de stock)


INSERT INTO TMP_002
(
SELECT A.CSTEVS, A.CAGCVS, A.ACREVS, A.MCREVS,
A.ARTIVS, B.LARTH2, B.CDUPH2,
B.SP97H2, B.T297H2, B.FA97H2, B.SF97H2, B.SS97H2,
CAST(MIN(A.PRRVVS) AS DEC(9, 2)) AS ECAPRR,
CAST(SUM(A.QTEUVS) AS DEC(9, 3)) AS ECAQTE,
CAST(SUM(A.VALMVS) AS DEC(9, 2)) AS ECAVAL,
CAST
(
SUM(A.VALMVS) /
FLOAT
(
SUM(A.VALMVS) +
MIN(C.UPUFQH * C.PRRFQH * C.QTPHQH)
)
* 100
AS DEC(6, 2)
) AS ECAPRC,
CAST(MIN(C.UPUFQH * C.PRRFQH) AS DEC(9, 2)) AS TEOPRR,
CAST(MIN(C.QTPHQH) AS DEC(9, 3)) AS TEOQTE,
CAST(MIN(C.UPUFQH * C.PRRFQH * C.QTPHQH) AS DEC(9, 2)) AS TEOVAL,
CAST(SUM(A.QTEUVS) + MIN(C.QTPHQH) AS DEC(9, 3)) AS REEQTE,
CAST
(
SUM(A.VALMVS) + MIN(C.UPUFQH * C.PRRFQH * C.QTPHQH) AS DEC(9, 2)
) AS REEVAL
FROM STKMVT A
INNER
JOIN ARTICL B
ON A.ARTIVS = B.CARTH2
INNER
JOIN STKART C
ON A.CSTEVS = C.CSTEQH AND
A.CAGCVS = C.CAGCQH AND
A.ACREVS = C.ACALQH AND
A.MCREVS = C.MOECQH AND
A.ARTIVS = C.CARTQH
WHERE A.MREGVS = 'R'
AND B.SP97H2 = '11'
GROUP
BY A.CSTEVS, A.CAGCVS, A.ACREVS, A.MCREVS, A.ARTIVS,
B.LARTH2, B.CDUPH2, B.SP97H2, B.T297H2, B.FA97H2,
B.SF97H2, B.SS97H2
)

Dans cet exemple, la table TMP_002 n’existe pas. Elle est créée à  partir de la requête. La requête est exactement la même. Seule la création de la table à  l’exécution de la requête diffère.

Attention : V5R2 minimum.


CREATE TABLE TMP_002 AS
(
SELECT A.CSTEVS, A.CAGCVS, A.ACREVS, A.MCREVS,
A.ARTIVS, B.LARTH2, B.CDUPH2,
B.SP97H2, B.T297H2, B.FA97H2, B.SF97H2, B.SS97H2,
CAST(MIN(A.PRRVVS) AS DEC(9, 2)) AS ECAPRR,
CAST(SUM(A.QTEUVS) AS DEC(9, 3)) AS ECAQTE,
CAST(SUM(A.VALMVS) AS DEC(9, 2)) AS ECAVAL,
CAST
(
SUM(A.VALMVS) /
FLOAT
(
SUM(A.VALMVS) +
MIN(C.UPUFQH * C.PRRFQH * C.QTPHQH)
)
* 100
AS DEC(6, 2)
) AS ECAPRC,
CAST(MIN(C.UPUFQH * C.PRRFQH) AS DEC(9, 2)) AS TEOPRR,
CAST(MIN(C.QTPHQH) AS DEC(9, 3)) AS TEOQTE,
CAST(MIN(C.UPUFQH * C.PRRFQH * C.QTPHQH) AS DEC(9, 2)) AS TEOVAL,
CAST(SUM(A.QTEUVS) + MIN(C.QTPHQH) AS DEC(9, 3)) AS REEQTE,
CAST
(
SUM(A.VALMVS) + MIN(C.UPUFQH * C.PRRFQH * C.QTPHQH) AS DEC(9, 2)
) AS REEVAL
FROM STKMVT A
INNER
JOIN ARTICL B
ON A.ARTIVS = B.CARTH2
INNER
JOIN STKART C
ON A.CSTEVS = C.CSTEQH AND
A.CAGCVS = C.CAGCQH AND
A.ACREVS = C.ACALQH AND
A.MCREVS = C.MOECQH AND
A.ARTIVS = C.CARTQH
WHERE A.MREGVS = 'R'
AND B.SP97H2 = '11'
GROUP
BY A.CSTEVS, A.CAGCVS, A.ACREVS, A.MCREVS, A.ARTIVS,
B.LARTH2, B.CDUPH2, B.SP97H2, B.T297H2, B.FA97H2,
B.SF97H2, B.SS97H2
) WITH DATA

Pour deux tables de structure identiques, insertion dans la table 1 du contenu de la table 2 :

Dans cet exemple, la requête insère dans une table temporaire TMP_003 à  l’image de la table EMPLOYE, le contenu de la table EMPLOYE.

TMP_003 et EMPLOYE ont une structure identique.


INSERT INTO TMP_003
SELECT * FROM EMPLOYE

Print Friendly, PDF & Email