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 :

Jointure pour remonter 2 fois la même ligne


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut Jointure pour remonter 2 fois la même ligne
    Bonjour,

    J'ai une table Variable et une table correction. Une variable possède 0..n corrections.

    Je cherche à faire une requête SQL qui, lorsque un ou plusieurs corrections existent, renvoie aussi une ligne pour représenter la variable brut.

    Exemple :

    MaVar Null
    MaVar2 Null
    MaVar2 Correction

    J'ai pu arriver à mon résultat en faisant un UNION entre une requête qui ne traite pas les corrections et une deuxième qui elle traite les corrections, mais j'aurais voulu savoir s'il existait un moyen de faire sans UNION ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Sans connaitre la structure ni le contenu de tes tables, pas plus que la requête que tu as construite, il est bien difficile de t'aider.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    J'ai été pris de court j'allais edit mon post xD

    Ma table Variable est de la forme :
    * Code : GUID
    * CodeObjectVariable : GUID
    * Designation

    Cette table stocke une variable modèle (CodeObjectVariable est alors null) puis une variable instance qui reprend la variable modèle (CodeObjectVariable de l'instance pointe vers le Code du modèle)

    Ma table correction :
    * Code
    * Nom
    * CodeVariable
    * Formule

    CodeVariable pointe vers ma variable modèle (donc toutes les variables instances auront la même formule du modèle, par exemple ax+b)

    La requête de base mais qui ne renvoie pas de ligne par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         select V_MODEL.Designation as tag, V_INSTANCE.Code, C_INSTANCE.CodeVariable
         from
         acq.Variable AS V_INSTANCE INNER JOIN
         acq.Variable AS V_MODEL ON V_MODEL.Code = V_INSTANCE.CodeObjetVariable LEFT JOIN
         acq.Correction AS C_INSTANCE ON V_MODEL.Code = C_INSTANCE.CodeVariable

    La requête qui fonctionne avec le UNION
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
         select V_MODEL.Designation as tag, V_INSTANCE.Code, C_INSTANCE.CodeVariable
         from
     
         acq.Variable AS V_INSTANCE INNER JOIN
         acq.Variable AS V_MODEL ON V_MODEL.Code = V_INSTANCE.CodeObjetVariable INNER JOIN
         acq.Correction AS C_INSTANCE ON V_MODEL.Code = C_INSTANCE.CodeVariable
     
         UNION
         select V_MODEL.Designation as tag, V_INSTANCE.Code, null
         from
     
         acq.Variable AS V_INSTANCE INNER JOIN
                                acq.Variable AS V_MODEL ON V_MODEL.Code = V_INSTANCE.CodeObjetVariable
    Résultat désiré :
    ConsomationCompteur ED15D86F-9325-45AD-AAA1-2E0E9EBC47F5 NULL
    ConsomationCompteur ED15D86F-9325-45AD-AAA1-2E0E9EBC47F5 B7DF6551-8105-40A8-8360-F7A35C6F5F6A
    Mais j'aurais aimé savoir s'il y avait une meilleure approche que UNION ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Il a fallu que je relise plusieurs fois ta demande pour comprendre ton besoin : tu souhaites, qu'il existe ou non des lignes dans Correction, toujours retourner une ligne avec la colonne Correction à NULL.
    Alors oui, en effet, le LEFT JOIN ne répond pas à ton besoin et il faut passer par une UNION.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Et en partant du model avec uniquement des jointures ouvertes, qu'est ce que ça donne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select V_MODEL.Designation as tag, V_INSTANCE.Code, C_INSTANCE.CodeVariable
      from acq.Variable AS V_MODEL
      left join acq.Variable AS V_INSTANCE   ON V_INSTANCE.CodeObjetVariable = V_MODEL.Code
      LEFT JOIN acq.Correction AS C_INSTANCE ON C_INSTANCE.CodeVariable      = V_MODEL.Code

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il a fallu que je relise plusieurs fois ta demande pour comprendre ton besoin : tu souhaites, qu'il existe ou non des lignes dans Correction, toujours retourner une ligne avec la colonne Correction à NULL.
    Alors oui, en effet, le LEFT JOIN ne répond pas à ton besoin et il faut passer par une UNION.
    OK, merci pour la confirmation, j'espérais faire une requête sans UNION, je vais faire avec

    @skuatamad : pas mieux, merci quand même

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par Arnard Voir le message
    OK, merci pour la confirmation, j'espérais faire une requête sans UNION, je vais faire avec

    @skuatamad : pas mieux, merci quand même
    Pas sûr que ça soit mieux / plus lisible, mais si on veut éviter d'appeler 2 fois la vue, on peut faire un UNION sur une fausse table de duplication :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select V_MODEL.Designation as tag, V_INSTANCE.Code, C_INSTANCE.CodeVariable
      from acq.Variable AS V_MODEL
      CROSS JOIN ( SELECT 1 AS ValeurOriginale FROM DUAL UNION ALL SELECT 0 FROM DUAL) AS Duplicateur
      LEFT JOIN acq.Correction AS C_INSTANCE ON C_INSTANCE.CodeVariable = V_MODEL.Code AND Duplicateur.ValeurOriginale = 0
    WHERE ( Duplicateur.ValeurOriginale = 1 OR C_INSTANCE.CodeVariable IS NOT NULL)

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Si votre SGBD le supporte, vous pouvez mutualiser la jointure dans une CTE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with cte_variable (Designation, Code, CodeVariable) as
    (
    select v_model.Designation
         , v_instance.Code
         , v_model.Code
      from acq.Variable as v_instance
      join acq.Variable as v_model     on v_model.Code = v_instance.CodeObjetVariable
    )
    select var.Designation, var.Code, cor.CodeVariable
      from cte_variable   as var
      join acq.Correction as cor on cor.CodeVariable = var.CodeVariable
     union all
    select var.Designation, var.Code, null
      from cte_variable   as var;

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

Discussions similaires

  1. VBA - Dupliquer plusieurs fois la même ligne
    Par Max_Mer dans le forum Excel
    Réponses: 2
    Dernier message: 14/03/2016, 10h17
  2. [XL-2013] Relier deux Userforms pour les inscrire sur une même ligne
    Par keithingel dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/09/2014, 15h42
  3. Réponses: 4
    Dernier message: 20/09/2014, 08h25
  4. problème pour éxecuter 2 fois le même code à la suite
    Par cvdistri dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 09/07/2008, 00h50
  5. Réponses: 9
    Dernier message: 09/03/2007, 21h44

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