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 26/08/2011, 00h35   #1
Membre confirmé
 
Inscription : juin 2006
Messages : 566
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 566
Points : 277
Points : 277
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 :
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 ?
Djobird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 08h36   #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
Citation:
Sauf que, comment je fais pour savoir à quelle donnée correspond B.valeur ?
j'ai du mal à comprendre de sens de la question...


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

Code :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 16h17   #3
Membre confirmé
 
Inscription : juin 2006
Messages : 566
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 566
Points : 277
Points : 277
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 ?
Djobird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 16h26   #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 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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 16h45   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Il te faut deux jointures et non pas une jointure à double condition :
Code :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 17h04   #6
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:
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
Citation:
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 17h16   #7
Membre confirmé
 
Inscription : juin 2006
Messages : 566
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 566
Points : 277
Points : 277
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 :
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)
Djobird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 18h39   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/08/2011, 19h13   #9
Membre confirmé
 
Inscription : juin 2006
Messages : 566
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 566
Points : 277
Points : 277
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.
Djobird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 02h08   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Djobird Voir le message
La table est assez grosse
Combien de millions de lignes ?
Citation:
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/08/2011, 09h54   #11
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 09h57   #12
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Pourriez vous exploiter une telle requête
Code :
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 09h59   #13
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Code :
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 11h09   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 16h22   #15
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/08/2011, 10h22   #16
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 16h30   #17
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 16h51   #18
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 18h18   #19
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 16h37   #20
Membre confirmé
 
Inscription : juin 2006
Messages : 566
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 566
Points : 277
Points : 277
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.
Djobird est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h00.


 
 
 
 
Partenaires

Hébergement Web