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 :

JOIN sur de multiples conditions


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut JOIN sur de multiples conditions
    Bonjour,
    voila supposons que j'ai les table suivantes:
    Table A:
    -id
    -output
    -input

    Où output et input sont des clés étrangères sur la table:
    Table B:
    -id
    -valeur
    -type

    Je voulais faire quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.output, A.input, B.valeur FROM A JOIN B ON (A.output=B.id OR A.input=B.id) WHERE B.type = blabla
    Sauf que, comment je fais pour savoir à quelle donnée correspond B.valeur ? Est ce que ça va être celle de output, ou de input ?

    Est ce que je peux faire ça avec un seul JOIN, ou je dois en utiliser 2, ou encore une sous requête ?

  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
    Sauf que, comment je fais pour savoir à quelle donnée correspond B.valeur ?
    j'ai du mal à comprendre de sens de la question...


    Est ce que ça va être celle de output, ou de input ?
    par exemple ou utilisant un CASE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT .....,
        CASE WHEN A.Input = B.Id THEN 'Input'
          ELSE 'Output'
        END
    FROM .....

    ou par un UNION
    Mais quelle sera la plus rapide ??? à tester
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Je ne sais pas si j'ai compris ce que tu proposes, mais je crois que ca ne correspond pas à ce que je veux.

    Supposons que j'ai les données suivantes

    Table A:
    -id : 1 2
    -output : 1 1
    -input : 2 3


    Table B:
    id : 1 2 3
    valeur : a b c
    type : g d b


    Ce que je veux obtenir c'est quelque chose du genre

    (A.id = 1, A.output=1, A.input=2, B.valeur=a, B.valeur=2)

    Mais comment puis je savoir que B.valeur=a correspond a ouput, et que B.valeur=2 correspond a input ?

  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 Djobird Voir le message
    Je ne sais pas si j'ai compris ce que tu proposes, mais je crois que ca ne correspond pas à ce que je veux.

    Supposons que j'ai les données suivantes

    Table A:
    -id : 1 2
    -output : 1 1
    -input : 2 3


    Table B:
    id : 1 2 3
    valeur : a b c
    type : g d b


    Ce que je veux obtenir c'est quelque chose du genre

    (A.id = 1, A.output=1, A.input=2, B.valeur=a, B.valeur=2)

    Mais comment puis je savoir que B.valeur=a correspond a ouput, et que B.valeur=2 correspond a input ?
    Je ne comprends rien a ce que vous essayez de nous expliquer
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il te faut deux jointures et non pas une jointure à double condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.id, A.output, A.input
        B1.valeur AS valeur_output
        B2.valeur AS valeur_input
    FROM A
    INNER JOIN B B1 ON B1.id = A.output
    INNER JOIN B B2 ON B2.id = A.input
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    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
    Ce que je veux obtenir c'est quelque chose du genre

    (A.id = 1, A.output=1, A.input=2, B.valeur=a, B.valeur=2)
    ce n'est pas ce qui était écrit dans le premier message
    pour rappel
    SELECT A.output, A.input, B.valeur FROM A JOIN B ON (A.output=B.id OR A.input=B.id) WHERE B.type = blabla
    cinephil a fourni la solution en tout cas à ta demande... mais peut-être pas à ton souhait
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Ce dont j'ai besoin est dans mon deuxieme message, à savoir:
    (A.id = 1, A.output=1, A.input=2, B.valeur=a, B.valeur=b)

    Je pensais que l'on pouvait obtenir ca avec une requete du genre celle que je proposais ...

    Qu'est censer donner cette requete dans ce cas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT A.output, A.input, B.valeur FROM A JOIN B ON (A.output=B.id OR A.input=B.id) WHERE B.type = 2
    Sinon merci bien CinePhil, c'est ce que je craignais, je vais devoir faire ca autrement :/ (je ne peux pas me permettre de faire une double jointure sur ces tables)

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Djobird Voir le message
    (je ne peux pas me permettre de faire une double jointure sur ces tables)
    Et pourquoi donc ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    La table est assez grosse et cette requête sera exécutée trop souvent, la charge sera trop élevée pour la BD. De plus je ne l'ai pas précisé ici, mais table B devra être jointe elle aussi à chaque fois à une table C.
    Un simple JOIN irait, mais 2 on craint que ça soit trop lourd. Mais bon on va tester ça quand même de tout façon.

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Djobird Voir le message
    La table est assez grosse
    Combien de millions de lignes ?
    Mais bon on va tester ca quand meme de tout facon.
    Deux jointures sur des entiers et sur des colonnes indexées, ça devrait passer sans problème jusqu'à plusieurs millions de lignes.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Vos considérations sur les performances me paraissent bien subjective...

    Correctement indexé il ne devrait pas y avoir de soucis...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Pourriez vous exploiter une telle requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT A.id, A.output as VALUE
        B.valeur,CAST(1 AS BIT) AS OUTPUT
    FROM A
       INNER JOIN B 
          ON B.id = A.output
    UNION
    SELECT A.id, A.input AS VALUE
        B.valeur,CAST(0 AS BIT) AS OUTPUT
    FROM A
       INNER JOIN B 
          ON B.id = A.input
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  13. #13
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.id, A.output, A.input
        B1.valeur AS valeur_output
        B2.valeur AS valeur_input
    FROM A
    INNER JOIN B B1 ON B1.id = A.output
    INNER JOIN B B2 ON B2.id = A.input
    Attention ici tout de même aux INNER JOIN qui excluraient les lignes pour lesquelles l'un des deux prédicat de jointure serait faux pour la ligne...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    D'après ce que j'ai compris, output et input sont des clés étrangères donc elles ne devraient pas être à NULL et INNER JOIN devrait toujours fonctionner.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    D'après ce que j'ai compris, output et input sont des clés étrangères donc elles ne devraient pas être à NULL et INNER JOIN devrait toujours fonctionner.
    Le fait qu'elles soient des clés étrangères ne conditionnent pas le fait qu'elle soit NOT NULL...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Le fait qu'elles soient des clés étrangères ne conditionnent pas le fait qu'elle soit NOT NULL...
    En bonne conception si !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  17. #17
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    En bonne conception si !
    Comment modélisez vous les relations 0-1?


    En OLTP on est bien d'accord?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Comment modélisez vous les relations 0-1?
    Réponse dans mon blog !

    Et je ne vois pas le rapport avec OLTP !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  19. #19
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Et je ne vois pas le rapport avec OLTP !
    Et je vous comprends

    Beaucoup de "spécialiste BI" utilise des clé à 0 dans les tables référencées pour justement éviter les NULL en FK... d'où ma remarque.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  20. #20
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    La table en elle même ne devrait pas contenir des masses d'info, peut être 1 ou 2 millions.
    Le probleme est que la table A va devoir être jointe deux fois à la table B qui contiendra à terme dans les 3 ou 4 millions de lignes, la table B devra être jointe 1 fois à une table C qu ia contenir aussi dans les 3 ou 4.
    Puis la table A doit être jointe 2 fois à une table D, qui elle va contenir dans les 10 millions d'entré.
    Bon hormis pour A, toutes les autres peuvent être indexé très simplement.
    De plus il est possible qu'on dans les 40 requêtes par secondes pour ce query.
    Peut être que tout va bien aller, je suis pessimiste.

Discussions similaires

  1. [Débutant] conditions sur des multiples
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 6
    Dernier message: 03/07/2010, 18h15
  2. [Oracle] Pb conditions sur tables multiples
    Par guitou12 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2006, 15h48
  3. [SQL] Pb conditions sur tables multiples
    Par guitou12 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/08/2006, 13h49
  4. Condition sur un multiple de ....!
    Par Orakle dans le forum Access
    Réponses: 2
    Dernier message: 08/03/2006, 15h34
  5. INNER JOIN sur une requete UPDATE
    Par Immobilis dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2006, 14h05

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