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 :

Comment éviter un curseur ?


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut Comment éviter un curseur ?
    Bonjour,

    J'aurais besoin de votre aide pour transformer un curseur immonde en une belle requête à base de jointures.

    J'ai une table avec les champs suivants :
    - ID
    - TYPE
    - DATE CHANGEMENT TYPE
    - COMMENTAIRE

    Je veux connaître toutes les IDs qui ont été du TYPE donné dans un intervallede DATES donné. Par exemple, je vais avoir 3 lignes pour l'id 001 :
    001 - TYPEA - 01/01/2007 - blabla
    001 - TYPEB - 01/04/2007 - blabla
    001 - TYPEC - 01/05/2007 - blabla

    Si j'effectue ma requête en cherchant tous les ID qui ont été du TYPEB entre le 15/04/2007 et le 01/06/2007 je veux obtenir :
    001 - TYPEB - 01/04/2007 - 01/05/2007 - blabla
    En effet 001 était du TYPEB au moins un jour dans l'intervalle de recherche.

    Ma technique immonde était de faire des curseurs pour ajouter un champ DATE FIN TYPE dans une table temporaire, puis de faire une requête dessus.
    Vous n'auriez pas une astuce pour éviter ça ?

  2. #2
    Membre expérimenté Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Par défaut
    Eu, A moins que je n'ai pas entièrement saisie tout la subtilité du problème, je vois pas pourquoi c'est faire la jointure.
    Est ce que ça ça ne fait pas l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          Select *
          From 
            maTable t1
          Where
            t1.type = 'TYPEB'
            And t1.datechangementtype Between Convert(datetime, '15/04/2007', 103) And  Convert(datetime, '01/06/2007 ', 103)

  3. #3
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut
    Justement non, là tu n'as que ceux qui sont DEVENUS du type A pendant l'intervalle, tu n'as pas ceux qui y étaient depuis une date antérieure, comme je le disais dans l'exemple. C'est là tout le problème. ^^'

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Le plus simple dans ton cas est de charger une table temporaire avec plusieurs requêtes de sélection. Ainsi tu pourras visualiser l'ensemble des enregistrements que tu souhaites.

    Exemple :

    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
     
    CREATE #TEMPO(
    ID VARCHAR(5)
    TYPE VARCHAR(50)
    DATE_CHANGE DATETIME
    COMMENTAIRE VARCHAR(50)
    )
     
    INSERT INTO #TEMPO
    SELECT * FROM maTable t1
    WHERE t1.type = 'TYPEB' AND t1.datechangementtype < Convert(datetime, '15/04/2007', 103) 
     
    INSERT INTO #TEMPO
    SELECT * FROM maTable t1
    WHERE t1.type = 'TYPEB' AND t1.datechangementtype BETWEEN Convert(datetime, '15/04/2007', 103) AND  Convert(datetime, '01/06/2007 ', 103)
     
    SELECT * FROM #TEMPO

  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
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Une seule requête suffit en utilisant le quantificateur d'existance EXISTS.

    Pour que l'on vous donne plus d'aide, merci de respecter la charte de postage en mettant le DDL de votre table ainsi qu'un jeu d'essais sous forme de script SQL.
    http://www.developpez.net/forums/showthread.php?t=96701

    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/ * * * * *

  6. #6
    Membre expérimenté Avatar de Cpas2latarte
    Inscrit en
    Janvier 2006
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 237
    Par défaut
    c'est bine ce que je pensais, je n'avais pas saisie tout le problème

    Je veux connaître toutes les IDs qui ont été du TYPE donné dans un intervallede DATES donné. Par exemple, je vais avoir 3 lignes pour l'id 001 :
    je passerai par une sous-requête
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Select * from matable t1
     where t1.id In (
        Select t2.id From matable t2
        where t1.id = t2.id 
        and t2.date between xxxxxxxxxx
        and t2.type = 'xxxx'
     )

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    EXISTS sera beaucoup plus efficace dans ce cas.

    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/ * * * * *

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

Discussions similaires

  1. [SQL SERVER 2000]Comment éviter l'utilisation de curseur
    Par TiteCoCo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/04/2008, 09h13
  2. Réponses: 2
    Dernier message: 06/12/2006, 09h09
  3. [eclipse 2.1][compilation] Comment éviter...
    Par ftrifiro dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 16h16
  4. Comment mettre le curseur d'un Memo sur le Canvas d'une Form ?
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2003, 13h24
  5. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

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