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 01/08/2011, 11h31   #1
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Par défaut Problème de Sous requêtes

Bonjour Amis Développeurs,
j'ai un petit problème sur une requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT * 
FROM ( 
SELECT * 
FROM [TABLE1] 
WHERE 
[CHAMP1] NOT IN (SELECT [CHAMP1] FROM [TABLE2]) 
AND 
[CHAMP1] NOT IN (SELECT [CHAMP1] FROM [TABLE3]) 
 
UNION ALL 
 
SELECT * 
FROM [TABLE4] 
WHERE 
[CHAMP1] NOT IN (SELECT [CHAMP1] FROM [TABLE5]) 
AND 
[CHAMP1] NOT IN (SELECT [CHAMP1] FROM [TABLE6]) 
) 
ORDER BY [CHAMP1];
cette requête me permet de récupérer des valeurs d'une table qui ne sont pas présentes dans les deux autres.

Normalement cette requête devrait me retourner un résultat et là rien, j'ai fait les vérifications à la mano je retrouve bien mes données. j'ai essayé de modifier le AND par un OR mais il me trouve les doublons...

quelqu'un à une idée ?

merci pour vos réponses
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 11h37   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

première chose, ce serait bien d'utiliser le petit bouton "Code" pour mettre en exergue le code

pour les requête UNION, l’écriture
SELECT * est à proscrire.

Essayes en indiquant explicitement les colonnes à afficher.
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 11h50   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 087
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 087
Points : 1 890
Points : 1 890
Bonjour,
Sans jeu de données, difficile à dire... Mais je pense que tu peux réécrire ta requête sans sous-requête:
Code SQL :
1
2
3
4
5
6
 
SELECT champ1
FROM table1
LEFT OUTER JOIN table2 ON table2.champ1 = table1.champ1
LEFT OUTER JOIN table3 ON table3.champ1 = table1.champ1
WHERE table2.champ1 IS NULL OR table3.champ1 IS NULL
Cette méthode devrait en outre être plus rapide.

Je te laisse ajouter l'union avec la deuxième partie de la requête. Je pense que mettre le tout dans une sous-requête est aussi inutile.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 12h10   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par neoscars Voir le message
j'ai essayé de modifier le AND par un OR mais il me trouve les doublons...
Vous essayez ?? mais le fait de remplacer un AND par un OR modifie totalement votre regle fonctionnelle... Le developpement n'est pas une question d'essai de code...

Definisissez votre regle fonctionnelle. Une fois que celle est bien définie et bornée, vous pouvez vous attaquer au code !

Dans votre exemple, l'expression de besoin semble etre (pour la 1ere partie de la requete) :
Rechercher les données présentes dans la table TABLE1 et non présentes dans aucune des tables TABLE2 et TABLE3

RF1 : Presente dans TABLE1
RF2 : Non Presente dans TABLE2
RF3 : Non Presente dans TABLE3

RF1 . RF2 . RF3

Si vous remplacez par un OR, votre résultat devient

RF1. (RF2 + RF3)
=> Données présente dans TABLE 1 et au moins manquantes dans une des tables TABLE2 et TABLE3

Votre code est syntaxiquement correcte, si les résultats retournés ne sont pas ceux que vous attendez, c'est que votre regle fonctionnelle n'est pas celle que vous décrivez.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/08/2011, 12h11   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par tatayo Voir le message
Bonjour,
Sans jeu de données, difficile à dire... Mais je pense que tu peux réécrire ta requête sans sous-requête:
Code SQL :
1
2
3
4
5
6
 
SELECT champ1
FROM table1
LEFT OUTER JOIN table2 ON table2.champ1 = table1.champ1
LEFT OUTER JOIN table3 ON table3.champ1 = table1.champ1
WHERE table2.champ1 IS NULL OR table3.champ1 IS NULL
Cette méthode devrait en outre être plus rapide.

Je te laisse ajouter l'union avec la deuxième partie de la requête. Je pense que mettre le tout dans une sous-requête est aussi inutile.

Tatayo.
Préférez le NOT EXISTS, plus performant sur les colonnes indexées.
Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 13h23   #6
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par Yanika_bzh Voir le message
Vous essayez ?? mais le fait de remplacer un AND par un OR modifie totalement votre règle fonctionnelle... Le développement n'est pas une question d'essai de code...
....
Excusez moi, je me suis surement mal exprimé, mais quand je parle d'essayer c'est juste pour vérifier que ma requête me retourne un résultat et donc que syntaxiquement c'est correct.Je comprends bien la différence entre un ET et un OU.

Je travaille sur une réserve de "données sensibles" , je ne peux pas vous fournir des données désolé. EDIT: J'ai testé avec la méthode ci-dessus même résultat.
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 13h27   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Le fait de reecrire la requete sous une forme differente ne vous fera pas evoluer vos résultat. Le probleme vient du fait que SUREMENT la regle annoncée Pas TABLE2 ET Pas TABLE3 n'est pas VRAIE, puisqu'en remplacant par un OR vous obtenez des résultats doublés !
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 13h59   #8
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Nous sommes d'accord,sauf que j'ai bien des cas où les deux sont VRAIS mais la requête ne me remonte pas ces résultats là. Si je ne me trompe pas la table d'un ET c'est 0.0=0 0.1=0 1.0=0 1.1=1
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 14h47   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Si RF2.RF3 = 1 et que votre resultat est faux, c'est alors que RF1 est vraissemblablement faux.

Code :
1
2
3
4
5
6
7
8
9
SELECT 
   A.Col1 
FROM
   TABLEA A 
WHERE
    NOT EXISTS (
       SELECT 1 FROM TABLEB B WHERE A.Col1 = B.Col1)
    AND NOT EXISTS (
       SELECT 1 FROM TABLE C WHERE A.Col1 = C.Col1)
Quel est votre SGBD ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 15h21   #10
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Je viens d'essayer votre solution même problème ,j'utilise Access 2007
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 15h28   #11
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous pouvez poster votre veritable requete ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 15h47   #12
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
SELECT *
FROM (
  SELECT * 
  FROM ConsosNulles071 
  WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim071 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes071)
  UNION ALL
  SELECT * 
  FROM ConsosNulles072 
  WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim072 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes072)
  UNION ALL
  SELECT * 
  FROM ConsosNulles073 
  WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim073 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes073)
  UNION ALL
  SELECT * 
  FROM ConsosNulles074 
  WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim074 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes074)
  UNION ALL
  SELECT * 
  FROM ConsosNulles075 
  WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim075 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes075)
) 
ORDER BY NOPDCO;
J'optimiserai ma requête plus tard (enlever les *)
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 15h59   #13
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
et vous avez donc trouvé un NOPDCO dans ConsosNulles071
qui n'est présent ni dans Estim071, ni dans FraisFixes07 et qui pourtant n'est pas retourné par cette simple requete :

Code :
1
2
3
4
SELECT * 
  FROM ConsosNulles071 
  WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim071 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes071)
?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h05   #14
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Ok pour les *, mais j'espère que la structure des tables est la même, çà a l'air...

par contre, l'architecture de la base a l'air curieuse. Autant de table qu'il y a de ... je ne sais pas quoi.

bon passons

Comme l'a écrit je ne sais plus qui un peu avant le NOT EXIST est plus performant.

Mais avez-vous testé chaque requête en solo ?
dans une requête UNION chaque requête est indépendante.

êtes-vous sûr qu'il y a quelque chose à renvoyer ?

------

mince devancer par yanika
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h07   #15
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
oui , il est présent dans la table FraisFixes.
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h10   #16
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
C'est tout l'objet de l'investigation
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h12   #17
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par neoscars Voir le message
oui , il est présent dans la table FraisFixes.
Si il est présent dans FraisFixes, c'est normal qu'aucun résultat ne soit renvoyé non ??

Code :
1
2
WHERE NOPDCO NOT IN (SELECT NOPDCO FROM Estim071 )
  AND NOPDCO NOT IN (SELECT NOPDCO FROM FraisFixes071)
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h18   #18
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par dehorter olivier Voir le message
Ok pour les *, mais j'espère que la structure des tables est la même, çà a l'air...

par contre, l'architecture de la base a l'air curieuse. Autant de table qu'il y a de ... je ne sais pas quoi.

bon passons

Comme l'a écrit je ne sais plus qui un peu avant le NOT EXIST est plus performant.

Mais avez-vous testé chaque requête en solo ?
dans une requête UNION chaque requête est indépendante.

êtes-vous sûr qu'il y a quelque chose à renvoyer ?

------

mince devancer par yanika
Oui vous avez raison, l'architecture est vraiment bizarre voir invressemblable (pas de clés primaires, des nombreux champs avec des accents,certaines dates au format américain d'autres non, etc) mais quand on reprend le boulot d'un autre on ne fait pas la fine bouche

j'ai testé chaque requête, j'ai même éclaté chaque ligne de mon code SQL
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h30   #19
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Distribution

Informations forums :
Inscription : août 2011
Messages : 9
Points : 1
Points : 1
Problème résolu , j'ai juste eu besoin de recharger les données dans les tables.
J'ai dû mal à comprendre le problème (peut être un problème de migration de Oracle vers Access), excusez moi d'avoir pris votre temps c'est un geste que j'aurai dû faire depuis le début.

Cordialement.
neoscars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h32   #20
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Citation:
mais quand on reprend le boulot d'un autre on ne fait pas la fine bouche
bonne chance

Citation:
j'ai testé chaque requête, j'ai même éclaté chaque ligne de mon code SQL
et au moins une de ces requêtes renvoie quelque chose ?

parce que Yanika_bzh a raison ...
dehorter olivier est actuellement 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 13h46.


 
 
 
 
Partenaires

Hébergement Web