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 :

Simplification requête SQL


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut Simplification requête SQL
    Bonjour,

    Est-ce qu'il y a moyen de faire la requête ci-dessous plus simplifiée et plus propre ?

    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT        TOP (100) PERCENT dbo.E_ANLA.ANLN1, dbo.E_ANLA.TXT50, dbo.E_ANLA.GDLGRP, dbo.E_ANLA.ORD43, dbo.E_ANLA.ANLN2, dbo.E_ANLZ.STORT
    FROM            dbo.E_ANLA 
     
    				INNER JOIN dbo.E_ANLZ ON dbo.E_ANLA.ANLN1 = dbo.E_ANLZ.ANLN1
     
    				INNER JOIN (SELECT        ANLN1, MAX(ANLN2) AS Max2
                                   FROM            dbo.E_ANLA
                                   GROUP BY ANLN1) ReqMax ON dbo.E_ANLA.ANLN1=ReqMax.ANLN1 and dbo.E_ANLA.ANLN2=ReqMax.Max2
     
    WHERE        (dbo.E_ANLZ.BDATU = '99991231') AND (dbo.E_ANLZ.GSBER = '0001')
    ORDER BY dbo.E_ANLA.ANLN1
    Comme vous pouvez le voire, le but est de prendre le MAX du champ ANLN2 de la table E_ANLA, faire une jointure avec ANLN1 qui se trouvent dans les 2 table spour récupérer le champ STORT de E_ANLZ, et filtrer avec le WHERE à la fin sur les 2 champs BDATU et GSBER de la table E_ANLZ

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 139
    Par défaut
    Plus propre, certainement : en utilisant des alias sur les noms de tables, en déplaçant la restriction sur la valeur maximum de ANL2 dans la clause WHERE, en supprimant le TOP (100) PERCENT sans intérêt...
    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
    SELECT  NLA.ANLN1
        ,   NLA.TXT50
        ,   NLA.GDLGRP
        ,   NLA.ORD43
        ,   NLA.ANLN2
        ,   NLZ.STORT
    FROM    dbo.E_ANLA  NLA
        INNER JOIN
            dbo.E_ANLZ  NLZ
            ON  NLA.ANLN1 = NLZ.ANLN1
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    dbo.E_ANLA Req
            	WHERE	NLA.ANLN1 = Req.ANLN1
                HAVING  NLA.ANLN2 = MAX(Req.ANLN2)
            )
        AND NLZ.BDATU = '99991231'
        AND NLZ.GSBER = '0001'
    ORDER BY NLA.ANLN1
    ;
    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
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 031
    Billets dans le blog
    6
    Par défaut
    Le top ne sert à rien si ce n'est que faire perdre de la performances.
    Récrivez comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.ANLN1, A.TXT50, A.GDLGRP, A.ORD43, A.ANLN2, Z.STORT
    FROM   dbo.E_ANLA AS A
           INNER JOIN dbo.E_ANLZ AS Z ON A.ANLN1 = Z.ANLN1
      		 INNER JOIN (SELECT MAX(ANLN2) AS Max2
                       FROM   dbo.E_ANLA
                       GROUP  BY ANLN1) ReqMax 
                 ON A.ANLN1 = ReqMax.ANLN1 and A.ANLN2=ReqMax.Max2
    WHERE  Z.BDATU = '99991231' AND Z.GSBER = '0001'
    ORDER  BY ANLN1
    Vous pouvez tester aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH T AS 
    (
    SELECT A.ANLN1, A.TXT50, A.GDLGRP, A.ORD43, A.ANLN2, Z.STORT, 
           MAX(ANLN2) OVER(PARTITION BY ANLN1 ) AS MAX2
    FROM   dbo.E_ANLA AS A
           INNER JOIN dbo.E_ANLZ AS Z ON A.ANLN1 = Z.ANLN1
    WHERE  Z.BDATU = '99991231' AND Z.GSBER = '0001'
    )
    SELECT ANLN1, TXT50, GDLGRP, ORD43, ANLN2, STORT
    FROM   T
    WHERE  ANLN2 = MAX2
    ORDER  BY ANLN1;
    Qui ira sans doute plus vite !

    Comme vous n'avez pas respecter la charte de postage il est impossible de vérifier ces requêtes !
    La charte : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Par défaut
    Super, merci ,tout fonctionne.

    Cependant, si je souhaite rajouter un MAX également sur le champ BDATU de la table ANLZ, de quelle façon faut-il procéder ?

    Merci

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 031
    Billets dans le blog
    6
    Par défaut
    De la même faço, mais tout dépend du groupage que vous voulez :
    Pour un max absolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(BDATU) OVER() AS MAX3
    Pour un max relatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(BDATU) OVER(PARTITION BY ANLN1 ) AS MAX3
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 16h41
  2. Simplification de requêtes SQL
    Par XGuarden dans le forum VB.NET
    Réponses: 8
    Dernier message: 30/12/2010, 12h31
  3. Simplification requête SQL
    Par squall6969 dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/07/2008, 14h55
  4. Simplification d'une requête SQL
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 07/09/2006, 07h37
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38

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