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 :

Aide sur une requête


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut Aide sur une requête
    Bonjour à tous,
    J'ai une requete à faire, la règle est la suivante :
    sélectionner les elements n de la table t_element; avec la condition suivante : s'il existe des elements de t_element dans t_element_x alors les selectionner, sinon selectionner les elements de t_element_y exisants dans t_element; sachant que t_element_x et t_element_y possèdent des clés étrangères de la t_element (cad les données de ses deux tables proviennent de la table t_element).
    Quelqu'un pourrait m'aider ? Merci.

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    tu peux commencer par lire ça : http://sql.developpez.com/sqlaz/select/

    et ça : http://sql.developpez.com/sqlaz/jointures/


    Ensuite montre-nous ton code et on pourra certainement t'aider.

    Bon courage

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Merci Mathus, je connais SQL mais le problème ici c'est que je ne vois pas comment faire entrer deux conditions dépendant l'une de l'autre dans un SELECT. Si j'avais une seule condition, j'aurai simplement mis un LEFT JOIN, mais là je ne vois pas trop comment faire, et c'est un peu urgent.

  4. #4
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    tu utilises quel SGBD ?

    pourquoi tu tiens à faire ça d'un seul coup ?
    avec une petite procédure et if(exists(...)) ça devient simple.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Et bien je te propose un left join sur t_element_x et un autre sur t_element_y.
    Et pour toutes les données communes aux deux tables, tu peux utiliser la fonction coalesce(champ_x, champ_y).
    Si il n'y a pas l'info dans t_element_x, alors coalesce la prend dans t_element_y.

    C'est un peu global comme réponse, mais pour plus de détail, il faudrait que tu nous donnes plus d'informations, et des exemples (et peut-être un schéma de tables...).

    ced

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Mathus, j'utilise SQL Server.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par ced Voir le message
    Bonjour,

    Et bien je te propose un left join sur t_element_x et un autre sur t_element_y.
    Et pour toutes les données communes aux deux tables, tu peux utiliser la fonction coalesce(champ_x, champ_y).
    Si il n'y a pas l'info dans t_element_x, alors coalesce la prend dans t_element_y.

    C'est un peu global comme réponse, mais pour plus de détail, il faudrait que tu nous donnes plus d'informations, et des exemples (et peut-être un schéma de tables...).

    ced
    Merci ced, le début de requête devrait ressembler à ça :

    SELECT liv.code, liv.label
    FROM t_livre AS liv
    LEFT JOIN t_livre_x AS x ON liv.code = x.code
    LEFT JOIN t_livre_y AS y ON liv.code = y.code

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Quelqu'un pourrait me dire comment je peux utiliser le COALESCE pour compléter ma requête svp ?

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Quels sont les champs qu'on retrouve à la fois dans t_livre_x et t_livre_y et que tu souhaites voir dans ta requête ?

    ced

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par ced Voir le message
    Quels sont les champs qu'on retrouve à la fois dans t_livre_x et t_livre_y et que tu souhaites voir dans ta requête ?

    ced
    il y a un seul champ en commun qui est le code (celui avec lequel j'ai fait les jointures avec t_livre).

  11. #11
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT liv.code, liv.label, coalesce(x.code, y.code)
    FROM t_livre AS liv
    LEFT JOIN t_livre_x AS x ON liv.code = x.code
    LEFT JOIN t_livre_y AS y ON liv.code = y.code
    Je trouve que ça fait un peu redondant avec liv.code.
    Peux-tu repréciser, sinon, ce que tu attends de la requête ?

    ced

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par ced Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT liv.code, liv.label, coalesce(x.code, y.code)
    FROM t_livre AS liv
    LEFT JOIN t_livre_x AS x ON liv.code = x.code
    LEFT JOIN t_livre_y AS y ON liv.code = y.code
    Je trouve que ça fait un peu redondant avec liv.code.
    Peux-tu repréciser, sinon, ce que tu attends de la requête ?

    ced
    Je veux récupérer les noms des livres (t_livre.label) tels que s'il y a des livres dans la table t_livre_x alors les récupérer, sinon récupérer les livres de la table t_livre_y.

  13. #13
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    tu n'as qu'à faire et basta
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select label
    from t_livre_x
    union
    select label
    from t_livre_y

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Mathusalem Voir le message
    tu n'as qu'à faire et basta
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select label
    from t_livre_x
    union
    select label
    from t_livre_y
    Avec l'union, je vais avoir les livres des deux tables, non ? alors que je veux avoir les livres de table x, si la table x est vide, je prends les livres de la table y.

  15. #15
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    oui mais ça va supprimer les doublons, donc ça devrait aller

  16. #16
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT coalesce(x.code, y.code) AS code, coalesce(x.label, y.label) as titre
    FROM t_livre AS liv
    LEFT JOIN t_livre_x AS x ON liv.code = x.code
    LEFT JOIN t_livre_y AS y ON liv.code = y.code
    ced

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Mathusalem Voir le message
    oui mais ça va supprimer les doublons, donc ça devrait aller
    C'est pas un problème de doublons, mais on va avoir les livres des deux tables x et y avec l'union, ce qui n'est pas le but.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par ced Voir le message
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT coalesce(x.code, y.code) AS code, coalesce(x.label, y.label) as titre
    FROM t_livre AS liv
    LEFT JOIN t_livre_x AS x ON liv.code = x.code
    LEFT JOIN t_livre_y AS y ON liv.code = y.code
    ced
    Merci ced, j'ai testé la requête mais ça ne fonctionne pas dans tous les cas :
    Lorsque des livres existent dans les deux tables x et y, la requête retourne les livres de x et y, alors que dans ce cas, il faudrait qu'il n'y ait que les livres de x retournés !!

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 138
    Points : 53
    Points
    53
    Par défaut
    J'ai réussi à faire ma requête en 2 fois (un Dataset pour exprimer ma condition sur les livres), et ça marche !!
    Merci beaucoup Ced et Mathus de votre aide.

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

Discussions similaires

  1. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  2. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  3. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29
  4. Aide sur une requête
    Par TshAw dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2005, 11h42
  5. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26

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