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 :

transformer jointure d'union


Sujet :

Langage SQL

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut transformer jointure d'union
    Bonjour,
    j'ai une requete ou je voudrais transformer l'union en simple jointure. j'explique le contexte:

    j'ai une table ACCESS qui contient des USER
    USER appartien à un CLIENT.

    les droits pour un LOGIN de consulter les user sont enregistrés dans deux tables:

    je dois prendre tous les users de la table USER_RIGHT avec le login_id en paramètre ET TOUS les users du CLIENT de la table CLIENT_LOGIN si lle paramètre ALL = 1.

    le shéma
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ACCESS (ACCESS_ID,USER_ID ..)
    USER(USER_ID,CLIENT_ID)
    CLIENT(CLIENT_ID,....)
    USER_RIGHTS(LOGIN_ID,USER_ID)
    CLIENT_LOGIN(LOGIN_ID,CLIENT_ID,ALL)
    la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT * FROM ACCESS access
    LEFT JOIN USER user on access.USER_ID = user.USER_ID
    LEFT JOIN CLIENT client on client.client_id = user.client_id
    inner join (
    SELECT USER_ID FROM USER_RIGHTS WHERE LOGIN_ID=90
    UNION ALL
    SELECT  u.USER_ID AS USER_ID FROM CLIENT_LOGIN cl INNER JOIN USER u ON u.client_id = cl.client_id WHERE  cl.ALL =1 AND cl.LOGIN_ID=90 )
    ) union  ON access.USER_ID = union.USER_ID

  2. #2
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Je ne crois pas que ce soit possible étant donné que la jointure ne te permettra pas d'aller taper dans les deux tables USER_RIGHTS et CLIENT_LOGIN en parallèle, comme le fait l'union.

    Et que penses tu du fait que le UNION ALL peut-être remplacé par un UNION simple et que les LEFT JOIN sont inutiles ici étant donné que tu finis par un INNER JOIN ...


    ERE

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    Salut,

    Je ne crois pas que ce soit possible étant donné que la jointure ne te permettra pas d'aller taper dans les deux tables USER_RIGHTS et CLIENT_LOGIN en parallèle, comme le fait l'union.

    Et que penses tu du fait que le UNION ALL peut-être remplacé par un UNION simple et que les LEFT JOIN sont inutiles ici étant donné que tu finis par un INNER JOIN ...


    ERE
    Ok, je pensais que la requete serait plus optimale avec des jointures mais si elle est impossible..alors pas le choix..

    Merciii

  4. #4
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Et supprime le ALL de ton UNION car si tu as des USER_ID en double il va te les prendre et cela va alourdir la jointure.

    A+,

    ERE

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Merci ..
    @+

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Encore une petite question ..

    Si je fais l'union dans une vue, et dans ma requete je fais la jointure avec la vue..
    c'est mieux?

  7. #7
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    Encore une petite question ..

    Si je fais l'union dans une vue, et dans ma requete je fais la jointure avec la vue..
    c'est mieux?
    Si tu utilises beaucoup cette requête, certainement puisque la vue va être mise à jour et donc il n'aura pas besoin de recalculer l'union en permanence. Par contre tu n'auras pas plus l'avantage de pouvoir utiliser un INDEX dans ta vue puisque de mémoire Oracle ne peut utiliser un index sur une union (car 2 requetes à exécuter quoi qu'il se passe). Je vais quand même demander un avis et te le repasse ensuite (Vue materialisée à utiliser ?).


    ERE

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par emmanuel.remy Voir le message
    Si tu utilises beaucoup cette requête, certainement puisque la vue va être mise à jour et donc il n'aura pas besoin de recalculer l'union en permanence. Par contre tu n'auras pas plus l'avantage de pouvoir utiliser un INDEX dans ta vue puisque de mémoire Oracle ne peut utiliser un index sur une union (car 2 requetes à exécuter quoi qu'il se passe). Je vais quand même demander un avis et te le repasse ensuite (Vue materialisée à utiliser ?).


    ERE
    Il s'agit de Sql Server 2005, pas Oracle , je teste avec la vue et l'exécution semble bien se passer ..

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Si vous faites une vue classique, vous aurez exactement les mêmes performances entre la vue et la sous-requête, puisqu'une vue n'est qu'une simple requête. Si cette sous-requête vous est utile à d'autres endroits, vous avez effectivement un intérêt à la factoriser dans une vue.

    Si vous faites une vue indexée (l'équivalent SQL Server de la vue matérialisée d'Oracle), vous aurez un gain de performance puisque les données seront stockées dans une table :
    http://technet.microsoft.com/fr-fr/l...15(en-us).aspx

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    ça marche bien avec la vue, maintenant je vais essayé la vue indexé..

    Merci messieurs

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

Discussions similaires

  1. [MySQL] Jointure et Union en SQL
    Par pablofr dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/11/2011, 17h49
  2. Multi-requêtes en colonnes (jointure ou union)
    Par franquis dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/06/2010, 15h37
  3. Réponses: 7
    Dernier message: 07/09/2008, 09h01
  4. Transformer requête imbriquée en jointure
    Par Nadoo dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/05/2006, 00h41
  5. UNION jointure etc... je patauge...
    Par Boumeur dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/03/2005, 22h45

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