Accueil du site > Les articles > Aide mémoire sur les instructions INSERT en SQL.
Version à imprimer Enregistrer au format PDF

Aide mémoire sur les instructions INSERT en SQL.

jeudi 30 septembre 2004, par David Malle Visites  26804 |Popularité : 46% 

Si vous avez d’autres activités que la programmation, qu’il vous soit nécessaire de faire de temps en temps une requête SQL, je suis prêt à parier que vous avez besoin de vous reporter à un aide mémoire.

Cet article décrit succintement les différentes manières d’insérer des enregistrements dans une table via une requête SQL.


Exemple utilisé

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

 [1]

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