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

Requêtes et SQL. Discussion :

Insertion conditionnelle


Sujet :

Requêtes et SQL.

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 734
    Points : 637
    Points
    637
    Par défaut Insertion conditionnelle
    Bonjour,

    je suis en train de me prendre la tête pour créer une requête qui m'enregistre uniquement les nouveaux "Bon de travaux" dans une base access

    Le but est de faire une insertion uniquement si le BT_Num n'est pas déjà listé dans la table BTS .

    J'en arrive a ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO BTS(BTS_Num, BT_Libelle,BT_Date,BT_Atelier,BT_Statut)
    VALUES('10029255','B393 Seuils d''alarme pression,'19.05.2014',''Automation','NEW')
    WHERE BT_Num  NOT IN (SELECT BT_Num FROM BTS)
    ... mais Access m'eng... à chaque fois : "La requête doit être construite à partir d'au moins une table ou une requête source"

    Vous avez une idée ?

    Merci d'avance

    Olivier

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    votre clause where à besoin d'une clause select pour fonctionner...

    de ce fait, vous devriez partir sur une syntaxe en insert select
    INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase] SELECT [source.]field1[, field2[, …] FROM tableexpression

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Par ailleurs, si dans la table BTS, il peut y avoir plusieurs occurrences d'un même BT_NUM, il est préférable de remplacer

    WHERE BT_Num NOT IN (SELECT BT_Num FROM BTS)

    Par

    WHERE NOT Exists (SELECT 1 FROM BTS SUBQ WHERE SUBQ.BT_NUM=MAIN.BT_NUM)

    requête qui sera plus performante (pas de construction du sous ensemble des réponses)
    il faudra bien sur penser à ajouter l'alias (MAIN dans mon exemple) dans la requete principale

  4. #4
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Si BTS_Num est une clé primaire, tu n'as pas besoin de ça, le système lui même va le rejeter.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par islamov2000 Voir le message
    Si BTS_Num est une clé primaire, tu n'as pas besoin de ça, le système lui même va le rejeter.
    Oui attention toutefois, certains sites imposent, dans leurs normes de développement, de tester l'unicité avant insertion

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    On traite ça dans les exceptions .
    Puisque tu es en phase de développement, tu mets le test puis l'instruction d'insertion.
    Ms Access reste limité pour traiter cela directement dans une insert into.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Oui attention toutefois, certains sites imposent, dans leurs normes de développement, de tester l'unicité avant insertion
    Ça c'est une connerie monstre de la plus haute stupidité !
    Aurais tu quelques noms à dénoncer et mettre au pilori ?
    Parce que comme bêtise inutile et plombeuses de performances y'a pas mieux !!!

    A +

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    C'est pas faute d'avoir milité contre, et pourtant c'est assez courant, je l'ai rencontré chez différents clients

    Si vous voyez les normes de développement qu'on impose sur certains sites de production, c'est parfois affligeant

    J'étais récemment chez un client, qui impose de gérer les erreurs "graves" dans les accesseurs, j'ai eu beau me bagarrer pour expliquer qu'un accesseur ne pouvait décider de la gravité d'un code retour, puisque un même code SQL pouvait être grave ou non en fonction du contexte, rien n'y a fait, la norme chez ce client reste figée dans le marbre, et l'accesseur décide pour vous
    Ce n'est qu'un exemple parmi tant d'autres

    Et pire : ces accesseurs ne renvoient jamais la SQLCA complète, pas même le SQLCODE, mais seulement un code retour maison dont la valeur peut être identique pour plusieurs codes SQL !
    on arrête pas le progrès.

    Des fois on se dit que l'élevage des chèvres dans le Larzac, c'est tentant !

  9. #9
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 734
    Points : 637
    Points
    637
    Par défaut
    Hello,

    je n'y arrive pas ... j'ai testé ce qui me semble se rapprocher le plus de ce qui a été proposé, mais toujours sans résultats ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO BTS(BTS_Num, BT_Libelle,BT_Date,BT_Atelier,BT_Statut)
    SELECT'10029255','B393 Seuils d''alarme pression 30 bar','19.05.2014','Systèmes d''Automation','NEW' FROM BTS 
    WHERE  NOT EXISTS (SELECT BT_Num FROM BTS WHERE BT_Num='10029255')
    Olivier

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Quelles sont les informations en retour ? SQLCODE et autres champs de la SQLCA ?

  11. #11
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    bin, rien qu'a voir la requete, je dirais problème d'alias :
    on se retrouve avec deux BTS pas alliassées, donc ca on n'aime pas en général.

    De deux, si ton where est vérifie, tu vas doublé ton nombre de lignes...

    c'est quoi l'équivalent du dual en sql server ? supprimer le from fonctionne ?

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Ce n'est pas un problème d'alias, il faut faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO BTS 
          (BTS_Num, BT_Libelle, BT_Date, BT_Atelier, BT_Statut) 
    SELECT '10029255', 'B393 Seuils d''alarme pression 30 bar', '19.05.2014', 'Systèmes d''Automation', 'NEW' 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT BT_Num FROM BTS WHERE BT_Num='10029255')
    DUAL a adapter en fonction du SGBD (SYSIBM.SYSDUMMY1 si DB2 for Z/OS, rien si SQL-server ou Access)

  13. #13
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 734
    Points : 637
    Points
    637
    Par défaut
    Hello,

    encore merci pour votre aide.


    J'ai testé le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO BTS 
          (BTS_Num, BT_Libelle, BT_Date, BT_Atelier, BT_Statut) 
    SELECT '10029255', 'B393 Seuils d''alarme pression 30 bar', '19.05.2014', 'Systèmes d''Automation', 'NEW' 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT BT_Num FROM BTS WHERE BT_Num='10029255')
    mais comme je suis sur Access, le DUAL ne fonctionne pas de base,j'ai cherché et trouvé sur le web une explication qui disait de créer une table "Dual" avec une unique ligne :

    Just create a table named Dual, with ONLY one row:

    Dual
    ----
    Field1 Text(1)

    Put an 'x' in the field.

    J'ai fait comme expliqué, mais pas mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ---------------------------
    Microsoft Access
    ---------------------------
    Opération non valide.
    ---------------------------
    OK   
    ---------------------------
    Olivier

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Reprend mon post précédent et enlève seulement la ligne "FROM DUAL" comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO BTS 
          (BTS_Num, BT_Libelle, BT_Date, BT_Atelier, BT_Statut) 
    SELECT '10029255', 'B393 Seuils d''alarme pression 30 bar', '19.05.2014', 'Systèmes d''Automation', 'NEW' 
    WHERE NOT EXISTS (SELECT BT_Num FROM BTS WHERE BT_Num='10029255')

  15. #15
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 734
    Points : 637
    Points
    637
    Par défaut
    ça donne :

    ---------------------------
    Microsoft Access
    ---------------------------
    Erreur de syntaxe (opérateur absent) dans l'expression « 'NEW' WHERE NOT EXISTS (SELECT BT_Num FROM BTS WHERE BT_Num='10029255') ».
    ---------------------------
    OK
    ---------------------------
    code SQL en debug.print :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO BTS(BTS_Num, BT_Libelle,BT_Date,BT_Atelier,BT_Statut) 
    SELECT '10029255','B393 Seuils d''alarme pression 30 bar','19.05.2014','Systèmes d''Automation','NEW' 
    WHERE  NOT EXISTS (SELECT BT_Num FROM BTS WHERE BT_Num='10029255')

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Etrange, c'est peut être lié à la version access

    sinon il y a une solution proposée ici avec du vba sous access

    http://bytes.com/topic/access/answer...-sql-statement , à tester

Discussions similaires

  1. Insertion conditionnelle de ligne
    Par Renaud-62 dans le forum DB2
    Réponses: 1
    Dernier message: 14/04/2010, 15h51
  2. Insertion conditionnelle d'images
    Par FTITEPILLE dans le forum Excel
    Réponses: 2
    Dernier message: 14/04/2010, 12h40
  3. Probleme d'insertion conditionnelle avec SQLLOADER
    Par pseudobidon57 dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 02/05/2007, 16h58
  4. insertions conditionnelles
    Par portuman dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/03/2006, 09h44
  5. [SQLRPG] Insertion conditionnelle ?
    Par JYL74 dans le forum DB2
    Réponses: 1
    Dernier message: 14/02/2006, 20h19

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