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

Développement SQL Server Discussion :

[TSQL] Optimiser une requête contenant des sous requêtes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Par défaut [TSQL] Optimiser une requête contenant des sous requêtes
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    select count(distinct C.FID) AS C from
    (
    select distinct a.NUM, a.EID, a.FID, a.TP as TP1, b.TP as TP2, a.TVD as TVD1, b.TVD as TVD2
    from
    (select distinct 
    t6.ID as EID, t4.NUM, t1.ID, t1.SMI, t1.RVD, t2.TSI, t3.TP, t3.TVD, t2.FID
    from TABLE1 t1
    inner join TABLE2 t2 on t1.SMI = t2.ID
    inner join TABLE3 t3 on t1.RVD = t3.ID
    inner join TABLE4 t4 on t2.FID = t4.ID
    inner join TABLE5 t5 on t4.SSI = t5.ID
    left join TABLE6 t6 on t6.ID = t5.EID 
    where t2.TSI = 0
    ) a
    full join
    (select distinct 
    t6.ID as EID, t4.NUM, t1.ID, t1.SMI, t1.RVD, t2.TSI, t3.TP, t3.TVD, t2.FID
    from TABLE1 t1
    inner join TABLE2 t2 on t1.SMI = t2.ID
    inner join TABLE3 t3 on t1.RVD = t3.ID
    inner join TABLE4 t4 on t2.FID = t4.ID
    inner join TABLE5 t5 on t4.SSI = t5.ID
    left join TABLE6 t6 on t6.ID = t5.EID 
    where t2.TSI = 1
    ) b
    on a.EID = b.EID and a.FID = b.FID 
    where a.TP = b.TP and a.RVD <> b.RVD
     
    ) AS C WHERE C.EID = 1234
    La requête ci-dessus me permet de compter tous les FID en vérifiant que les TP de la vue a sont présents dans la vue b et que leur RVD sont différents.

    Cependant, je voudrais pouvoir modifier ma requête afin de comptabiliser aussi les FID de la vue a dont les TP n'ont pas de correspondance dans la vue b
    et les FID de la vue b dont les TP n'ont pas de correspondance dans la vue a.


    Cordialement,

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    remontez votre condition de filtre dans la condition de jointure externe et faites le COUNT sur les différentes tables (COUNT de comptabilise pas les NULL)

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    remontez votre condition de filtre dans la condition de jointure externe et faites le [c]COUNT(/c] sur les différentes tables (COUNT de comptabilise pas les NULL)
    Merci pour votre réponse.

    Je n'ai pas compris ce que vous voulez dire par
    remontez votre condition de filtre dans la condition de jointure externe
    et faites le [c]COUNT(/c] sur les différentes tables (COUNT de comptabilise pas les NULL)

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    on a.EID = b.EID and a.FID = b.FID 
    where a.TP = b.TP and a.RVD <> b.RVD
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    on a.EID = b.EID and a.FID = b.FID 
    AND a.TP = b.TP and a.RVD <> b.RVD

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Par défaut
    Merci pour votre réponse et votre réactivité.

    Votre solution n'a pas fonctionné.

    Cependant, j'ai rajouté une 3ème sous requête qui m'a donné un résultat proche de ce que j'attends mais il y a encore des FID qui ne sont pas comptabilisés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    select count(distinct C.FID) AS C from
    (
    select distinct a.NUM, a.EID, a.FID, a.TP as TP1, b.TP as TP2, a.TVD as TVD1, b.TVD as TVD2
    from
    (select distinct 
    t6.ID as EID, t4.NUM, t1.ID, t1.SMI, t1.RVD, t2.TSI, t3.TP, t3.TVD, t2.FID
    from TABLE1 t1
    inner join TABLE2 t2 on t1.SMI = t2.ID
    inner join TABLE3 t3 on t1.RVD = t3.ID
    inner join TABLE4 t4 on t2.FID = t4.ID
    inner join TABLE5 t5 on t4.SSI = t5.ID
    left join TABLE6 t6 on t6.ID = t5.EID 
    where t2.TSI = 0
    ) a
    full join
    (select distinct 
    t6.ID as EID, t4.NUM, t1.ID, t1.SMI, t1.RVD, t2.TSI, t3.TP, t3.TVD, t2.FID
    from TABLE1 t1
    inner join TABLE2 t2 on t1.SMI = t2.ID
    inner join TABLE3 t3 on t1.RVD = t3.ID
    inner join TABLE4 t4 on t2.FID = t4.ID
    inner join TABLE5 t5 on t4.SSI = t5.ID
    left join TABLE6 t6 on t6.ID = t5.EID 
    where t2.TSI = 1
    ) b
    left join
    (select distinct 
    t6.ID as EID, t4.NUM, t1.ID, t1.SMI, t1.RVD, t2.TSI, t3.TP, t3.TVD, t2.FID
    from TABLE1 t1
    inner join TABLE2 t2 on t1.SMI = t2.ID
    inner join TABLE3 t3 on t1.RVD = t3.ID
    inner join TABLE4 t4 on t2.FID = t4.ID
    inner join TABLE5 t5 on t4.SSI = t5.ID
    left join TABLE6 t6 on t6.ID = t5.EID 
    where t2.TSI = 1
    ) c
    on a.EID = b.EID and a.FID = b.FID 
    where a.TP = b.TP and a.RVD <> b.RVD
    or (c.TP is null and b.TP is not null)
     
    ) AS C WHERE C.EID = 1234
    Peut-être qu'il faudrait rajouter une 4ème sous requête en faisant un right join ?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    En fait, je pense que vous pouvez même vous passer de toutes ces jointures.

    Avec un GROUP BY et quelques CASE, vous devriez obtenir ce que vous voulez, mais je n'ai pas compris précisément le besoin...
    un jeu d'essai avec résultat attendu aiderait surement à mieux comprendre.

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

Discussions similaires

  1. [9.5] Requête de selection dans une table contenant des redondances
    Par ghassen_khalil dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/06/2016, 13h59
  2. optimisation d'une vue avec plusieurs sous-requêtes
    Par jean62 dans le forum Développement
    Réponses: 7
    Dernier message: 08/08/2012, 15h29
  3. Utiliser une jointure ou des sous-requêtes
    Par seabs dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/03/2011, 21h02
  4. Optimisation d'une requête contenant des sous-requêtes
    Par Christophe Charron dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/06/2010, 15h34
  5. Afficher des sous-requêtes dans une requête
    Par ZashOne dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 16/04/2008, 10h07

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