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

Langage SQL Discussion :

Requête INSERT INTO avec deux conditions


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 29
    Points
    29
    Par défaut Requête INSERT INTO avec deux conditions
    Bonjour,
    j'ai actuellement une requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Table_Produit(Id_Produit, Id_Serial, Reference, Designation) 
    SELECT Id_Produit, Id_Serial, Reference, Designation 
    FROM Table_Panier 
    WHERE Table_Panier.Id_Produit NOT IN (SELECT Id_Produit 
    FROM Table_Produit)
    Elle fonctionne très bien, il n'y a pas de souci mais le problème est que j'aurais besoin d'une 2ème condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table_Panier.Id_Serial NOT IN (SELECT Id_Serial 
    FROM Table_Produit)
    Et il semblerait qu'on puisse n'en mettre qu'une dans ce fameux WHERE....
    Comment pourrais-je contourner ce problème, sachant que la fonction MERGE ne fonctionne pas avec ma Bdd (SQlite).

  2. #2
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    ça ne marche pas avec un "and" entre les 2?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO Table_Produit(Id_Produit, Id_Serial, Reference, Designation) 
    SELECT Id_Produit, Id_Serial, Reference, Designation 
    FROM Table_Panier 
    WHERE Table_Panier.Id_Produit NOT IN (SELECT Id_Produit 
    FROM Table_Produit) 
    and Table_Panier.Id_Serial NOT IN (SELECT Id_Serial 
    FROM Table_Produit)
    Sinon, les not in sont à éviter, il est préférable d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT tp.Id_Produit, tp.Id_Serial, tp.Reference, tp.Designation 
    FROM Table_Panier tp
    left join Table_Produit tp2 on tp.Id_Produit=tp2.Id_Produit 
    left join Table_Produit tp3 on tp.Id_Serial=tp3.Id_Serial 
    WHERE tp2.Id_Produit is NULL 
    and tp3.Id_Serial is NULL
    Pourquoi 2 not in sur la même table?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Et avec un AND, ça ne foonctionne pas ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO Table_Produit(Id_Produit, Id_Serial, Reference, Designation) 
    SELECT Id_Produit, Id_Serial, Reference, Designation 
    FROM Table_Panier 
    WHERE Table_Panier.Id_Produit NOT IN (SELECT Id_Produit 
    FROM Table_Produit)
    AND
    Table_Panier.Id_Serial NOT IN (SELECT Id_Serial 
    FROM Table_Produit)

    Tatayo.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    pinocchio => pour ta deuxième requête, j'ajouterai un distinct, car du fait des jointures il est possible que la requête renvoie plusieurs ignes identiques:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT distinct tp.Id_Produit, tp.Id_Serial, tp.Reference, tp.Designation 
    FROM Table_Panier tp
    LEFT JOIN Table_Produit tp2 ON tp.Id_Produit=tp2.Id_Produit 
    LEFT JOIN Table_Produit tp3 ON tp.Id_Serial=tp3.Id_Serial 
    WHERE tp2.Id_Produit IS NULL 
    AND tp3.Id_Serial IS NULL
    Sinon il y a un risque de doublon...

    Tatayo.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Bonjour,
    désolé de ne répondre que maintenant.

    Donc le "AND" ne semblait pas fonctionner quand j'ai essayé.

    Pourquoi j'ai besoin de 2 "Not in"?!
    Parce que ma base est surement mal foutu

    Du coup, en attendant vos réponses que je testerais quand je trouverai un moment dans l'avancement du projet, j'ai mis en place une solution de secours qui est d'avoir créé un nouveau champ qui est la fusion de id_produit et id_serial et donc je n'ai besoin que de faire un seul "NOT IN".
    Je sais, c'est bizarre et pas très propre mais ca fonctionne.

    Je l'améliorais avec vos solutions plus tard. En tout cas merci de votre aide.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Est ce que id_serial peut être NULL dans table_produit ?
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Id_Produit, Id_Serial, Reference, Designation 
      FROM Table_Panier 
     WHERE Table_Panier.Id_Produit NOT IN (SELECT Id_Produit FROM Table_Produit)
       AND Table_Panier.Id_Serial NOT IN (SELECT Id_Serial FROM Table_Produit where Id_Serial is not null)

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    C'est un concours de mauvaises idées ce sujet ?
    Bravo, vous avez presque tous gagné !

    Citation Envoyé par pinocchio Voir le message
    Sinon, les not in sont à éviter, il est préférable d'écrire :
    <requête avec jointures externes>
    Les NOT IN ne sont pas à éviter, ils ont leur utilisation.
    Comme NOT EXISTS, comme les jointures.
    Ce sont des outils, s'ils étaient à toujours proscrire, c'est simple ils n'existeraient pas. Pas de conclusion hâtive.

    Citation Envoyé par tatayo Voir le message
    pinocchio => pour ta deuxième requête, j'ajouterai un distinct, car du fait des jointures il est possible que la requête renvoie plusieurs ignes identiques
    Comme on recherche des lignes qui n'existent pas dans les deux autres tables, pas de risque de voir un doublon.

    Citation Envoyé par Netzo Voir le message
    j'ai mis en place une solution de secours qui est d'avoir créé un nouveau champ qui est la fusion de id_produit et id_serial et donc je n'ai besoin que de faire un seul "NOT IN".
    Je sais, c'est bizarre et pas très propre mais ca fonctionne.
    Là on n'est plus dans le pas très propre, mais dans la conception horrible qui va plomber votre base, déjà pas très nette.

    À mon avis, ce qui a été mal exprimé c'est que Netzo doit chercher à référencer le couple (Id_Produit, Id_Serie) et non pas chaque colonne unitairement.

    Si c'est bien ce besoin, on le traduit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO Table_Produit (Id_Produit, Id_Serial, Reference, Designation) 
    SELECT TP.Id_Produit, TP.Id_Serial, TP.Reference, TP.Designation 
      FROM Table_Panier TP
     WHERE NOT EXISTS (SELECT NULL
                         FROM Table_Produit TR
                        WHERE TR.Id_Produit = TP.Id_Produit
                          AND TR.Id_Serial  = TP.Id_Serial);
    J'ai supposé que les colonnes Id_Produit et Id_Serial sont NOT NULL.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Non justement, d'où le problème.

    Un produit a forcement un Id_Produit et un Id_Produit mais l'un ou l'autre peuvent exister sur un autre produit. (si c'est les 2, il s'agit du même produit, logique).

    exemple:
    Un produit A1 (id_produit= A et id_serial= 1)
    un produit A2
    un produit B1

    Je vais essayé ta requête quand j'aurais un moment, car comme je l'ai dit, j'ai mis en place une solution de secours pour pouvoir avancer sur le reste.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Waldar => effectivement, j'ai écrit AND en pensé OR dans la condition ...
    Ca m'apprendra à faire plusieurs choses en même temps.

    Tatayo.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Effectivement Waldar, c'est bien le couple que je dois chercher.

    Donc il faut que l'Id_Produit AND Id_Serial du produit ne soient pas dans la Table_Produit pour l'insérer sinon on update le produit dont l'Id_Produit OR l'Id_Serial existe.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Ta requete fonctionne Waldar. Merci
    Par contre, dans le cas où justement l'enregistrement existe dans la Table_Produit, je fais un UPDATE et la requête que j'essaie mets bien à jour les "quantités" des enregistrements concernés mais efface les "quantités" des autres.
    Une idée?

    la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE Table_Produit SET Quantite = Quantite + 
    (SELECT Quantite FROM Table_Panier 
    WHERE Table_Produit.Id_Serial = Table_Panier.Id_Serial
    AND Table_Produit.Id_Produit = Table_Panier.Id_Produit)

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il faut rajouter un WHERE EXISTS à l'update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE Table_Produit
       SET Quantite = Quantite + (SELECT Quantite
                                    FROM Table_Panier 
                                   WHERE Table_Produit.Id_Serial  = Table_Panier.Id_Serial
                                     AND Table_Produit.Id_Produit = Table_Panier.Id_Produit)
     WHERE EXISTS (SELECT NULL
                     FROM Table_Panier 
                    WHERE Table_Produit.Id_Serial  = Table_Panier.Id_Serial
                      AND Table_Produit.Id_Produit = Table_Panier.Id_Produit);
    Sans ce WHERE, vous mettez toutes les lignes à jour.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations forums :
    Inscription : Juin 2010
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Nickel Waldar! Ca marche impec!

    Merci à tout le monde

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

Discussions similaires

  1. [AC-2010] Requête Insert Into avec condition
    Par vittirivizzik dans le forum VBA Access
    Réponses: 5
    Dernier message: 03/09/2012, 14h01
  2. INSERT INTO avec une condition
    Par pol2095 dans le forum Requêtes
    Réponses: 5
    Dernier message: 31/01/2011, 23h06
  3. Problème de requète INSERT INTO avec access
    Par Hipopo dans le forum VB.NET
    Réponses: 7
    Dernier message: 29/03/2010, 12h52
  4. [AC-2002] Requête INSERT INTO avec SELECT et VALUES
    Par chim33 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/03/2010, 16h45
  5. Requête INSERT INTO avec des champs et des variables
    Par fips1962 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/05/2009, 17h51

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