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 :

requete optimale ?


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut requete optimale ?
    J'ai cette requete dont je ne suis pas très fier, je pense que l'on peut faire ça de manière plus simple et plus optimale.

    Je simplifie le problème :

    J'ai deux tables.

    La table CLI (client) avec un champ cli_id (cle de la table) et un champ cli_nom
    et la table transac (transaction des clients) avec les champs tr_id (cle de la table), cli_id et type (de la transaction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE cli (
    	[cli_id] [int] NOT NULL ,
    	[cli_nom] [varchar] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ) 
     
    CREATE TABLE transac (
    	[tr_id] [int] NOT NULL ,
    	[cli_id] [int] NOT NULL ,
    	[type] [int] NOT NULL 
    )
    Le but du jeu est d'obtenir une requete (pour en faire une vue) qui liste tous les clients avec le nombre de transactions associées (qui ne soient pas de type = 3) dans la table transac et donc 0 s'il n'y a pas de transaction.

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select transac.cli_id, count(*) as count_transac
    from transac 
    where transac.type <> 3
    GROUP BY transac.t_id 
    union
    select cli.cli_id, 0 as count_transac
    from cli
    where cli.cli_id not in (select transac.cli_id from transac )
    Peut-on faire mieux ?

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Bonjour,

    Comme je trouvais ton code difficile à lire, j'ai créé un exemple pour illuster ma façon de faire.

    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
    DECLARE @T_CLIENTS TABLE (CLIENT_ID INT)
     
    DECLARE @T_TRANSACTIONS TABLE (TRANSACTION_ID INT, CLIENT_ID INT)
     
    INSERT INTO @T_CLIENTS SELECT 1
    INSERT INTO @T_CLIENTS SELECT 2
    INSERT INTO @T_CLIENTS SELECT 3
    INSERT INTO @T_CLIENTS SELECT 4
     
    INSERT INTO @T_TRANSACTIONS SELECT 1, 1
    INSERT INTO @T_TRANSACTIONS SELECT 2, 1
    INSERT INTO @T_TRANSACTIONS SELECT 3, 1
    INSERT INTO @T_TRANSACTIONS SELECT 4, 2
    INSERT INTO @T_TRANSACTIONS SELECT 5, 1
    INSERT INTO @T_TRANSACTIONS SELECT 6, 4
    INSERT INTO @T_TRANSACTIONS SELECT 7, 4
     
    SELECT		C.CLIENT_ID, ISNULL(T.QTY, 0) AS QTY_TRANSACTIONS
    FROM		@T_CLIENTS C
    LEFT JOIN	(
    				SELECT CLIENT_ID, COUNT(*) AS QTY
    				FROM @T_TRANSACTIONS
    				GROUP BY  CLIENT_ID
    			)T	ON C.CLIENT_ID = T.CLIENT_ID
    CLIENT_ID QTY_TRANSACTIONS
    ----------- ----------------
    1 4
    2 1
    3 0
    4 2
    Voilà.

  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
    21 770
    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 : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Autre façon de faire (plus synthétique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT C.CLIENT_ID, 
           CASE 
              WHEN T.CLIENT_ID IS NULL THEN 0
              ELSE COUNT(*)
           END AS QTY_TRANSACTIONS
    FROM   @T_CLIENTS C
           LEFT OUTER JOIN @T_TRANSACTIONS T
                ON C.CLIENT_ID = T.CLIENT_ID
    GROUP  BY C.CLIENT_ID, T.CLIENT_ID
    de toute façon la seule façon de savoir quelles est la requête la plus optimisée est de compter les IO.

    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
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup, c'est le exactement genre de requètes que je cherchais !

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

Discussions similaires

  1. requete optimale ?
    Par Invité dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/01/2008, 14h54
  2. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  3. Requete requête sous sybase
    Par eddie dans le forum Sybase
    Réponses: 3
    Dernier message: 02/04/2003, 14h51
  4. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43
  5. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h22

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