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

MS SQL Server Discussion :

Interrogation sur la construction d'une requete


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut Interrogation sur la construction d'une requete
    Bonjour à tous,

    N'étant pas un expert en SQL, j'ai simplement besoin d'aide pour confirmer la construction d'une requête :

    Alors voila, j'ai deux requêtes distinctes sur la même table suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT Table1.Table1Id
    FROM Table1
    INNER JOIN Table2
    ON Table1.Table1Id = Table2.Table1id
    INNER JOIN Table3
    ON Table3.Table3Id = Table2.Table3id
    AND Table3.code = 'A04024'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT Table1.Table1Id
    FROM Table1
    INNER JOIN Table4
    ON Table1.Table1Id = Table4.grd_Table1Id
    INNER JOIN Table5
    ON Table5.Table5Id = Table4.Table5Id
    WHERE 
    Table5.num LIKE '04%'
    J'aimerai unir mes deux résultats en un seul, pour cela je peux utiliser UNION :
    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
    SELECT DISTINCT Table1.Table1Id
    FROM Table1
    INNER JOIN Table2
    ON Table1.Table1Id = Table2.Table1id
    INNER JOIN Table3
    ON Table3.Table3Id = Table2.Table3id
    AND Table3.code = 'A04024'
     
    UNION
     
    SELECT DISTINCT Table1.Table1Id
    FROM Table1
    INNER JOIN Table4
    ON Table1.Table1Id = Table4.grd_Table1Id
    INNER JOIN Table5
    ON Table5.Table5Id = Table4.Table5Id
    WHERE 
    Table5.num LIKE '04%'
    Enfin j'aimerai obtenir le meme résultat mais sans utiliser la clause UNION, alors j'utilise le left outer join comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT Table1.Table1Id, num
    FROM Table1
    LEFT OUTER JOIN Table2
    ON Table1.Table1Id = Table2.Table1id
    LEFT OUTER JOIN Table3
    ON Table3.Table3Id = Table2.Table3id
    LEFT OUTER JOIN Table4
    ON Table1.Table1Id = Table4.grd_Table1Id
    LEFT OUTER JOIN Table5
    ON Table5.Table5Id = Table4.Table5Id
    WHERE 
    Table3.code = 'A04024'
    OR
    Table5.num LIKE '04%'
    Selon vous est-ce la bonne solution ?

    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Par défaut
    Je préfère toujours recommencer à zéro quand je dois fusionner deux requêtes.

    Cela dit, tu peux vérifier la pertinence de chacune des options entre regardant, bien entendu, les résultats de la requêtes, mais aussi en comparant les plans d'exécution et en comparant les statistiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET STATISTICS TIME ON
    SET STATISTICS IO ON

  3. #3
    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,

    Afin de réduire le nombre de jointures externe dans votre dernière solution, vous pouvez aussi l'ecrire ainsi :

    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
     
    SELECT DISTINCT Table1.Table1Id, num
    FROM Table1
    LEFT OUTER JOIN Table2
            INNER JOIN Table3
                ON Table3.Table3Id = Table2.Table3id   
        ON Table1.Table1Id = Table2.Table1id
    LEFT OUTER JOIN Table4
            INNER JOIN Table5
                ON Table5.Table5Id = Table4.Table5Id
        ON Table1.Table1Id = Table4.grd_Table1Id
    WHERE 
        Table3.code = 'A04024'
      OR
        Table5.num LIKE '04%'
    Enfin, vous pouvez comparer avec un EXISTS qui pourrait être plus performant :

    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
     
    SELECT Table1.Table1Id, num
    FROM Table1
    WHERE EXISTS (
        SELECT 1
        FROM Table2
        INNER JOIN Table3
            ON Table3.Table3Id = Table2.Table3id   
        WHERE Table1.Table1Id = Table2.Table1id
        AND Table3.code = 'A04024'
    )
    OR EXISTS(
        SELECT 1
        FROM Table4
        INNER JOIN Table5
            ON Table5.Table5Id = Table4.Table5Id
        WHERE Table1.Table1Id = Table4.grd_Table1Id
        AND Table5.num LIKE '04%'
    )
    comme l'a indiqué Babyneedle, comparez les plan d’exécution et leurs temps/io respectifs, mais assurez vous avant d'avoir des données au plus proche de la réalité. Vous devriez également placer les indexs nécessaires a chaque requête avant de comparer.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 66
    Par défaut
    Merci pour vos réponses, c'est exactement ce que je cherchais.
    Mon server étant en maintenant aujourd'hui je ne pourrai pas tester.

    Je vous fait un retour sur ces solutions qui devraient résoudre mon problème des que possible

Discussions similaires

  1. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  2. Interrogation sur la conception d'une table
    Par catoucat dans le forum Modélisation
    Réponses: 4
    Dernier message: 05/07/2006, 10h38
  3. Changer les droits sur un objet via une requete
    Par gg72160 dans le forum Sécurité
    Réponses: 1
    Dernier message: 10/06/2006, 21h14
  4. [Firebird] DELETE sur le résultat d'une requete d'un IBQUERY
    Par shashark dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/06/2005, 18h17
  5. substr sur le $resultat d'une requete
    Par grellierj dans le forum Langage SQL
    Réponses: 12
    Dernier message: 21/01/2005, 11h28

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