Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 14h55   #1
Invité régulier
 
Inscription : juin 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 20
Points : 5
Points : 5
Par défaut Requête INSERT INTO avec deux conditions

Bonjour,
j'ai actuellement une requete:
Code :
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 :
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).
Netzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h41   #2
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
ça ne marche pas avec un "and" entre les 2?
Code :
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 :
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?
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h41   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 929
Points : 1 929
Bonjour,
Et avec un AND, ça ne foonctionne pas ?
Code SQL :
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h43   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 929
Points : 1 929
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 :
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 14h06   #5
Invité régulier
 
Inscription : juin 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 20
Points : 5
Points : 5
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.
Netzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 14h40   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
Est ce que id_serial peut être NULL dans table_produit ?
Que donne :
Code :
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)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h15   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 15h17   #8
Invité régulier
 
Inscription : juin 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 20
Points : 5
Points : 5
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.
Netzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h35   #9
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 929
Points : 1 929
Waldar => effectivement, j'ai écrit AND en pensé OR dans la condition ...
Ca m'apprendra à faire plusieurs choses en même temps.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h54   #10
Invité régulier
 
Inscription : juin 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 20
Points : 5
Points : 5
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.
Netzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 18h36   #11
Invité régulier
 
Inscription : juin 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 20
Points : 5
Points : 5
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 :
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)
Netzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 18h51   #12
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faut rajouter un WHERE EXISTS à l'update :
Code :
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h21   #13
Invité régulier
 
Inscription : juin 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 20
Points : 5
Points : 5
Nickel Waldar! Ca marche impec!

Merci à tout le monde
Netzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h34.


 
 
 
 
Partenaires

Hébergement Web