IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Requête INSERT avec 2 SELECT sans liaison?


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Requête INSERT avec 2 SELECT sans liaison?
    Bonjour,

    J'essaie d'insérer des données dans une table vide.
    Cette insertion se fait avec 2 select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NVL(MAX(ID_PDT_HISTOCODE), 0)+1 FROM PDT_HISTOCODE
    (actuellement renvoie la valeur 1 puisque la table est vide)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT PRODUIT.PRCLEUNIK, CID_ARTCLASSIF.ARTCLAVAL FROM CID_ARTCLASSIF, PRODUIT 
    WHERE PRODUIT.CIODM_ID=CID_ARTCLASSIF.ARTIDCIO 
    AND CID_ARTCLASSIF.ARTCLATYP='LPP' AND CID_ARTCLASSIF.ARTCLAFIN IS NOT NULL 
    AND CID_ARTCLASSIF.ARTCLAVAL NOT IN (SELECT T_CODEHISTO FROM PDT_HISTOCODE 
    WHERE PRCLEUNIK=PRODUIT.PRCLEUNIK AND C_TYPECODE=2)
    (actuellement renvoie 6 lignes à insérer)

    Je voudrais faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO PDT_HISTOCODE (ID_PDT_HISTOCODE, PRCLEUNIK, T_CODEHISTO) 
    (MON 1er SELECT, MON 2ème SELECT)
    Le 1er SELECT sert d'auto increment
    et le 2ème SELECT sert à récupérer les données dans 2 autres tables.

    La solution idéale serait d'avoir une séquence afin d'éviter le 1er SELECT hélas cette table PDT_HISTOCODE vient d'une application sur laquelle je n'ai aucun accès. Et si on passe par l'application le 1er SELECT est utilisé et le résultat est enregistré dans une variable avant d'être utilisé dans un INSERT (méthode très contestable mais comme dit avant je n'ai pas la main sur le développement de cette appli).

    Pour le moment, j'insére les données sans la clé de la table (ID_PDT_HISTOCODE) mais ça me convient à moitié.

    Quelqu'un aurait une idée ou une solution pour auto incrémenter mes insertions sans passer par une séquence?

    D'avance merci.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    UNION ALL et basta

    ou (selon le besoin que j'ai pas bien saisi ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    (SELECT NVL(MAX(ID_PDT_HISTOCODE), 0)+1 FROM PDT_HISTOCODE) AS increment,
    PRODUIT.PRCLEUNIK, CID_ARTCLASSIF.ARTCLAVAL FROM CID_ARTCLASSIF, PRODUIT 
    WHERE PRODUIT.CIODM_ID=CID_ARTCLASSIF.ARTIDCIO 
    AND CID_ARTCLASSIF.ARTCLATYP='LPP' AND CID_ARTCLASSIF.ARTCLAFIN IS NOT NULL 
    AND CID_ARTCLASSIF.ARTCLAVAL NOT IN (SELECT T_CODEHISTO FROM PDT_HISTOCODE 
    WHERE PRCLEUNIK=PRODUIT.PRCLEUNIK AND C_TYPECODE=2);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Oui, le SELECT tel quel fonctionne. Par exemple il me ramène le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	ID	PR	ART
    	1	13	3181870
    	1	13	3191756
    	1	10	3104987
    	1	12	3102422
    	1	12	3116588
    	1	12	3116588
    Mais lorsque j'exécute l'INSERT cela me renvoie une violation de contrainte sur la colonne ID.
    Si je supprime l'index, l'INSERT charge les données comme ci-dessus.
    En fait je ne comprends pas pourquoi à chaque INSERT la valeur ID ne s'incrémente pas automatiquement.

    J'ai aussi essayé le UNION ALL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO PDT_HISTOCODE (ID_PDT_HISTOCODE, PRCLEUNIK, T_CODEHISTO) 
    ((SELECT NVL(MAX(ID_PDT_HISTOCODE), 0)+1, 0, '' FROM PDT_HISTOCODE) 
    UNION ALL (SELECT 0, PRCLEUNIK, ARTCLAVAL FROM CID_ARTCLASSIF, PRODUIT 
    WHERE CIODM_ID=ARTIDCIO AND ARTCLATYP='LPP' AND ARTCLAFIN IS NOT NULL 
    AND ARTCLAVAL NOT IN (SELECT T_CODEHISTO FROM PDT_HISTOCODE 
    WHERE PRCLEUNIK=PRODUIT.PRCLEUNIK AND C_TYPECODE=2)));
    mais il me renvoie le résultat suivant (je ne suis pas sûr de la syntaxe à utiliser):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	ID	PR	ART
    	1	0	
    	0	13	3181870
    	0	13	3191756
    	0	10	3104987
    	0	12	3102422
    	0	12	3116588
    	0	12	3116588

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Finalement j'ai trouvé une solution qui semble marcher.
    Au lieu d'utiliser le +1 dans mon champ à incrémenter, je fais un +ROWNUM en dehors.
    Cela donne la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO PDT_HISTOCODE (ID_PDT_HISTOCODE, PRCLEUNIK, T_CODEHISTO) 
    (SELECT (SELECT NVL(MAX(ID_PDT_HISTOCODE), 0) FROM PDT_HISTOCODE)+ROWNUM, PRCLEUNIK, ARTCLAVAL 
    FROM CID_ARTCLASSIF, PRODUIT 
    WHERE CIODM_ID=ARTIDCIO AND ARTCLATYP='LPP' AND ARTCLAFIN IS NOT NULL 
    AND ARTCLAVAL NOT IN (SELECT T_CODEHISTO FROM PDT_HISTOCODE 
    WHERE PRCLEUNIK=PRODUIT.PRCLEUNIK AND C_TYPECODE=2))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête INSERT avec compteur incrémental (sans curseur)
    Par FMJ dans le forum Développement
    Réponses: 10
    Dernier message: 04/01/2014, 12h03
  2. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  3. [SQL Server 2K5] Requête INSERT avec deux SELECT
    Par gassisprog dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/08/2010, 14h55
  4. Requête INSERT avec VALUES et SELECT
    Par FredLo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/02/2010, 14h16
  5. Changer la police avec un select, sans recharger la page
    Par Netoman dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/12/2004, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo