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 :

Problème de Sous requêtes


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut Problème de Sous requêtes
    Bonjour Amis Développeurs,
    j'ai un petit problème sur une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    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.
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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)

  5. #5
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    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.

  7. #7
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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)

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    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

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Si RF2.RF3 = 1 et que votre resultat est faux, c'est alors que RF1 est vraissemblablement faux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    Je viens d'essayer votre solution même problème ,j'utilise Access 2007

  11. #11
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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)

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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 *)

  13. #13
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  14. #14
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  15. #15
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    oui , il est présent dans la table FraisFixes.

  16. #16
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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)

  17. #17
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  18. #18
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    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

  19. #19
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 3
    Points
    3
    Par défaut
    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.

  20. #20
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    mais quand on reprend le boulot d'un autre on ne fait pas la fine bouche
    bonne chance

    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 ...
    Merci d'ajouter un sur les tags qui vous ont aidé

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de sous requête (retour d'une seule valeur)
    Par ero-sennin dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/06/2006, 11h12
  2. Problème de sous-requêtes
    Par R'SKaP dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/05/2006, 19h39
  3. Problème de sous requête
    Par espadon1 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/05/2006, 15h20
  4. Problème de sous requête
    Par Draiwn dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/11/2005, 01h43

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