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 :

utilisation de Exist


Sujet :

Langage SQL

  1. #1
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut utilisation de Exist
    Bonjour à tous !

    Je voudrais votre avis sur une requête que j'utilise mais qui me semble un peu compliquée pour le but cherché

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     create table  #posbook
     (
     POS_security_id	int	 not null,
     POS_date		datetime not null,
     POS_book		float	null,
     POS_change		float	null,
     POS_sec_name		varchar(64)	null,
     POS_day		int, -- 1 si aujourd'hui, 0 si la veille
     POS_flag		int -- pour la mise en forme BO
     )

    Je remplis une première fois la table avec des données de l'avant veille (POS_day = 0).

    Je remplis ensuite avec les données de la veille (POS_day = 1).

    Je cherche à mettre POS_flag à 1 quand une position de l'avant veille à une valeur différente la veille et à 0 quand il n'y a aucun mouvement.

    je fais donc ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     -- on marque toutes les positions qui ont changés entre les 2 dates
     update #posbook 
     set  a.POS_flag = 1
     from #posbook  a 
     where a.POS_day = 1
     and exists (select * 
                 from #posbook  b 
                 where b.POS_day = 0 
                   and a.POS_security_id = b.POS_security_id 
                   and a.POS_book <> b.POS_book)
    ça vous pourrait correct ?
    il y a plus simple peut-être ?


    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Votre syntaxe me surprend, ça ne devrait pas plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     update #posbook a
     set  a.POS_flag = 1
     where a.POS_day = 1
     and exists (select * 
                 from #posbook  b 
                 where b.POS_day = 0 
                   and a.POS_security_id = b.POS_security_id 
                   and a.POS_book <> b.POS_book)
    Pour répondre à votre question, votre traitement me semble correct.

    Ceci dit, vous dîtes :
    Citation Envoyé par Mathusalem
    Je cherche à mettre POS_flag à 1 quand une position de l'avant veille à une valeur différente la veille et à 0 quand il n'y a aucun mouvement.
    Comment gérer vous le 2ème cas ?
    Avec une autre requête que celle que vous présentez ?

    Enfin, une solution pourrait consister à positionner une valeur par défaut pour la colonne POS_day dans le script de création de la table.
    Tu pourrais peut être économiser une requête d'insertion.
    Je ne prétends pas que cela améliore les performances et ça reste à apprécier dans votre contexte.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  3. #3
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    merci de ta réponse

    l'autre cas est simplement une initialisation à 0 de POS_flag.

    Je postais surtout pour être sur de ma requête, je ne suis pas du tout familier avec EXIST

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Mathusalem
    je ne suis pas du tout familier avec EXIST
    EXISTS peut être déroutant mais en fait c'est une construction très logique et intuitive une fois que l'on a compris que son utilisation passe par une sous-requête corrélée.
    cf. : http://sqlpro.developpez.com/cours/s...quetes/#L1.5.1
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/07/2007, 08h15
  2. Utiliser script bdD existant dans pgadmin
    Par vvaness30 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/03/2007, 11h35
  3. [ODBC][C#] Utilisation d'un lien existant
    Par selth dans le forum Accès aux données
    Réponses: 3
    Dernier message: 29/12/2006, 15h14
  4. Utilisation de EXISTS ou NOT EXISTS
    Par lucky31 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2006, 16h43
  5. [EasyPHP] un debugger simple à utiliser, ça existe?
    Par sam01 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 23/02/2006, 10h11

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