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 :

Requete OR qui ne ramene rien


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut Requete OR qui ne ramene rien
    Salut à tous

    Je travail sur Oracle 9i. J'ai la structure de table suivante :

    create table table1 (
    ID integer not null
    );

    create table table2 (
    ID1 integer not null,
    ID2 integer not null
    );

    insert into table1 values (1);

    insert into table1 values (2);

    insert into table1 values (3);

    insert into table2 values (1,10);

    insert into table2 values (1,20);

    insert into table2 values (2,30);


    Pas compliqué, hein ?


    J'essaie d'executer la requete suivante :

    select id from table1,
    (select id1 from table2 where id2 = 10000) a1,
    (select id1 from table2 where id2 = 10) b1
    where id = a1.id1 OR id = b1.id1;

    Et ca ne me ramene rien. Peanuts. Nada. No rows returned. Alors que je m'attendrais à avoir 1 row, puisque j'ai utilisé un OR. Donc même si la clause "a1" ne retourne rien, je devrais quand même avec les ID de table1 qui sont égales à "b1".
    Attention, je sais très bien que je pourrais structurer ma requête SQL différemment, mais ce n'est pas mon but, je veux qu'elle soit comme ça, et pas autrement, pour des questions de performances sur mon application réelle.


    Si je fais :

    select id from table1,
    (select id1 from table2 where id2 = 30) a1,
    (select id1 from table2 where id2 = 10) b1
    where id = a1.id1 OR id = b1.id1;

    Là j'ai bien quelque chose (1 et 2); en fait rien n'est retourné à partir du moment ou un de mes select imbriqués ne ramène rien. Si les 2 ramènent quelque chose, le OR fonctionne bien.

    Quelqu'un a une idée pour contourner ce problème ("select null from dual" ?) parce que là je sèche vraiment.

    Merci !

  2. #2
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Bonjour,
    c'est normal qu'il ne te ramène rien, car la table a1 (représenté par la sous-requête -> id2= 10000) est vide !
    En faisant un LEFT OUTER JOIN sur la table a1 ca devrait marcher.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  3. #3
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par lper
    Bonjour,
    c'est normal qu'il ne te ramène rien, car la table a1 (représenté par la sous-requête -> id2= 10000) est vide !
    En faisant un LEFT OUTER JOIN sur la table a1 ca devrait marcher.
    Merci pour ta réponse

    OK, je vais retourner prendre des cours de SQL... Pourtant je n'ai pas de critère de jointure explicite entre a1 et b1... ? là il y a un truc que je ne comprends pas bien.

    Quelqu'un aurais un exemple de syntaxe de LEFT OUTER JOIN ?

    Merci

  4. #4
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Sans critère de jointure entre les tables, c'est ce que j'appelle faire un produit cartésien (à tort peut-être), c'est à dire que le nombre de lignes retournées est égal à la multiplications des lignes de chaque table.

    Peux tu essayer le code suivant, si ton SGBD le permet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select id from table1
    left outer join (select id1 from table2 where id2 = 10000) a1
    left outer join (select id1 from table2 where id2 = 10) b1 
    where id = a1.id1 OR id = b1.id1;
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  5. #5
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    ou ça (sous Oracle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select id from table1, 
    (select id1 from table2 where id2 = 10000) a1, 
    (select id1 from table2 where id2 = 10) b1 
    where a1.id1(+) = id OR b1.id1(+) = id;
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  6. #6
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par lper
    Sans critère de jointure entre les tables, c'est ce que j'appelle faire un produit cartésien (à tort peut-être), c'est à dire que le nombre de lignes retournées est égal à la multiplications des lignes de chaque table.
    Oui effectivement. Ca fait du bien de revenir aux bases !

    Citation Envoyé par lper
    Peux tu essayer le code suivant, si ton SGBD le permet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select id from table1
    left outer join (select id1 from table2 where id2 = 10000) a1
    left outer join (select id1 from table2 where id2 = 10) b1 
    where id = a1.id1 OR id = b1.id1;
    La syntaxe que j'ai essayé est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select id from table1 
    left outer join (select id1 from table2 where id2 = 40) a1 
    on table1.id = a1.id1
    left outer join (select id1 from table2 where id2 = 10) b1 
    on table1.id = b1.id1
    ;

    Mais ce n'est toujours pas exactement ce que je voudrais, car ca me ramene toute la table table1.
    Voir www.praetoriate.com/oracle_tips_outer_joins.htm pour les détails et les différences entre Oracle 9i et 8i.
    Je continue à chercher dans cette direction.

  7. #7
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    As tu vu ma deuxième proposition de code (sous Oracle) ?
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  8. #8
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par lper
    As tu vu ma deuxième proposition de code (sous Oracle) ?
    oui oui. merci. Les critères de outer join sont apparemment interdits dans les clauses "OR" et "IN", cette syntaxe ne passe pas.

  9. #9
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par lper
    Il n'y a pas de outer join dans la 2ème proposition : , j'ai utilisé le '+'.
    excuse-moi, c'est moi qui me suis mal exprimé. Je parlais de la notion de outer join en général. La syntaxe des outer join avec les "+" ne passe pas dans des OR ou des IN. (message d'erreur : "Opérateur + de jointure extérieure non autorisé dans les clauses OR ou IN").

  10. #10
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    ok, alors peux tu tester ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id from table1, 
    (select id1 from table2 where id2 = 10000) a1, 
    (select id1 from table2 where id2 = 10) b1 
    where a1.id1(+) = id and b1.id1(+) = id and
     (a1.id1 = id or b1.id1 = id)
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  11. #11
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par lper
    ok, alors peux tu tester ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id from table1, 
    (select id1 from table2 where id2 = 10000) a1, 
    (select id1 from table2 where id2 = 10) b1 
    where a1.id1(+) = id and b1.id1(+) = id and
     (a1.id1 = id or b1.id1 = id)

    Ca marche au poil. je te remercie ! je vais essayer d'intégrer ça dans l'applic (où les requêtes SQL sont un peu plus compliquées quand même...)

    Merci
    A+

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

Discussions similaires

  1. [PDO] pdo - requete prepare qui ne retourne rien
    Par killgors dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 12/11/2011, 23h06
  2. Requete SQL qui ne retourne rien alors que ma table n est pas vide
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/06/2009, 19h16
  3. Requete Insert qui n'insère rien
    Par Oceliane dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 06/06/2007, 19h26
  4. Requete sql qui ne renvoie rien :-(
    Par patchouli dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/02/2007, 09h41
  5. [PostgreSql] requête simple qui ne renvoie rien ?
    Par tuxout dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/08/2006, 14h06

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