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 :

Vue SQL avec variable


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 34
    Points : 26
    Points
    26
    Par défaut Vue SQL avec variable
    Bonjour,

    Je souhaite inserer une variable dand une vue.

    Celle-ci doit faire référence à un champ date.

    Ci dessous la requete avec en rouge la variable correspondant au champ date)



    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    CREATE VIEW NEW_VIEW15(
           ECKTSOC,
           ECKTNUMERO,
           ECCTNOM,
           ECCJCRE,
           LCKTNUMERO,
           LCCJDEREX,
           LCCTSOLACE,
           LCKTSOC,
           LCCTCODE,
           LCCTSOLACC,
           LCCJDERCO,
           LCCTNATURE
    ) AS 
    select ECOMCLI.ecktsoc, ECOMCLI.ecktnumero, ECOMCLI.ecctnom, 
      ECOMCLI.eccjcre, LCOMCLI.lcktnumero, LCOMCLI.lccjderex, 
      LCOMCLI.lcctsolace, LCOMCLI.lcktsoc, LCOMCLI.lcctcode, 
      LCOMCLI.lcctsolacc, LCOMCLI.lccjderco, LCOMCLI.lcctnature 
    from ECOMCLI, LCOMCLI 
    where (
      ECOMCLI.ECKTSOC = LCOMCLI.lcktsoc 
      AND ECOMCLI.ECKTNUMERO = LCOMCLI.LCKTNUMERO 
      AND LCCJDEREX > LCCJDEREX 
      AND ECCJCRE < LCCJDEREX 
      AND LCCTSOLACE = 'S' 
      AND LCCTNATURE <> '7' 
    ) OR (
      ECOMCLI.ECKTSOC = LCOMCLI.lcktsoc 
      AND ECOMCLI.ECKTNUMERO = LCOMCLI.LCKTNUMERO 
      AND  ECCJCRE < LCCJDEREX 
      AND LCCTSOLACE <> 'S' 
      AND LCCTNATURE <> '7' 
    ) OR (
      ECOMCLI.ECKTSOC = LCOMCLI.lcktsoc 
      AND ECOMCLI.ECKTNUMERO = LCOMCLI.LCKTNUMERO 
      AND LCCTNATURE <> '7' 
      AND LCCTCODE = 'CL1414' 
      AND LCCTSOLACC <> 'S' 
      AND ECCJCRE < LCCJDEREX
    ) OR (
      ECOMCLI.ECKTSOC = LCOMCLI.lcktsoc 
      AND ECOMCLI.ECKTNUMERO = LCOMCLI.LCKTNUMERO 
      AND LCCTNATURE <> '7' 
      AND LCCTCODE = 'CL1414' 
      AND LCCTSOLACC = 'S' 
      AND ECCJCRE < LCCJDEREX 
      AND LCCJDERCO > LCCJDEREX
    )

    Peut on utiliser un champ comme variable,comment le declarer ?

    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    QuelestvotreSGBD?Pouvezvousfaireunpetiteffortdelisibilitédevotrerequête,vousvoyezcequejeveuxdire?

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Waldar
    Pouvezvousfaireunpetiteffortdelisibilitédevotrerequête,vousvoyezcequejeveuxdire?
    J'ai remis en forme la requête avec les bonnes balises.

    Citation Envoyé par Cobra02
    avec en rouge la variable correspondant au champ date)
    Mais du coup y'a plus de variable en rouge !

    Par contre en essayant de simplifier la requête, notamment en utilisant la syntaxe normalisée depuis 1992 pour les jointures, je trouve une erreur.
    Ceci sera toujours faux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND LCCJDEREX > LCCJDEREX
    Ne serait-ce pas plutôt cette condition, répétée dans les 3 OR ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ECCJCRE < LCCJDEREX
    La jointure devient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM ECOMCLI AS e
    INNER JOIN LCOMCLI AS l ON e.ECKTSOC = l.lcktsoc
      AND e.ECKTNUMERO = l.LCKTNUMERO
    Les conditions de jointure étant dans tous les OR, ça simplifie déjà la requête.

    Les conditions suivantes sont également répétées dans tous les OR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LCCTNATURE <> '7'
    AND ECCJCRE < LCCJDEREX
    On peut donc en faire un groupe en tête de WHERE.

    Il reste ces conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WHERE (
      LCCJDEREX > LCCJDEREX -- Erreur signalée plus haut !
      AND LCCTSOLACE = 'S' 
    ) OR (
      LCCTSOLACE <> 'S' 
    ) OR (
      LCCTCODE = 'CL1414' 
      AND LCCTSOLACC <> 'S' 
    ) OR (
      LCCTCODE = 'CL1414' 
      AND LCCTSOLACC = 'S' 
      AND LCCJDERCO > LCCJDEREX
    )
    Sous réserve de la correction de l'erreur par LCCJDERCO > LCCJDEREX, on peut encore simplifier.
    On a en effet d'une part le groupe suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (
      LCCJDERCO > LCCJDEREX 
      AND LCCTSOLACE = 'S' 
    ) OR (
    LCCTCODE = 'CL1414' 
      AND LCCTSOLACC = 'S' 
      AND LCCJDERCO > LCCJDEREX
    )
    Autrement dit (A et B) ou (A et B et C).
    Si (A et B) est vrai alors le ou sera vrai et la condition C est inutile.

    D'autre part le groupe suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (
      AND LCCTSOLACE <> 'S' 
    ) OR (
      AND LCCTCODE = 'CL1414' 
      AND LCCTSOLACC <> 'S'
    Autrement dit A ou (A et B).
    Si A est vrai alors le ou sera vrai et la condition B est inutile.

    ==> La condition LCCTSOLACC <> 'S' me semble inutile !

    Au final, la requête pourrait être simplifiée comme ceci :
    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 e.ecktsoc, e.ecktnumero, e.ecctnom, e.eccjcre, 
      l.lcktnumero, l.lccjderex, l.lcctsolace, l.lcktsoc, l.lcctcode, 
      l.lcctsolacc, l.lccjderco, l.lcctnature 
    FROM ECOMCLI AS e
    INNER JOIN LCOMCLI AS l ON e.ECKTSOC = l.lcktsoc
      AND e.ECKTNUMERO = l.LCKTNUMERO
    WHERE LCCTNATURE <> '7'
      AND ECCJCRE < LCCJDEREX 
      AND 
      (
        LCCJDERCO > LCCJDEREX 
        AND LCCTSOLACE = 'S' 
      ) OR (
        LCCTSOLACE <> 'S'
      )
    A vérifier.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    J'ai remis en forme la requête avec les bonnes balises.
    On perd l'intérêt didactique de ma réponse alors

    Très bonne factorisation des différents groupes de prédicats !

    L'intégriste de la mise en page que je suis aurait toutefois pu présenter la requête ainsi, mais là on rentre dans les goûts et les couleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select e.ecktsoc   , e.ecktnumero, e.ecctnom   , e.eccjcre   , 
           l.lcktnumero, l.lccjderex , l.lcctsolace, l.lcktsoc   , 
           l.lcctcode  , l.lcctsolacc, l.lccjderco , l.lcctnature 
      from ecomcli as e
           inner join lcomcli as l
             on e.ecktsoc    = l.lcktsoc
            and e.ecktnumero = l.lcktnumero
     where l.lcctnature <> '7'
       and e.eccjcre    <  l.lccjderex 
       and ( l.lcctsolace =  'S' and l.lccjderco > l.lccjderex 
        or  (l.lcctsolace <> 'S') );

Discussions similaires

  1. requete sql avec variable feuil-range
    Par jokenjo dans le forum Excel
    Réponses: 6
    Dernier message: 18/03/2008, 15h47
  2. Requête SQL avec variables
    Par BMT_Benoît dans le forum Windows Forms
    Réponses: 36
    Dernier message: 12/07/2007, 12h35
  3. Problème avec requête SQL avec variables
    Par harry25 dans le forum ASP
    Réponses: 1
    Dernier message: 03/01/2007, 03h41
  4. requete sql avec variable
    Par stefon dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/08/2006, 16h29
  5. requete sql avec variable
    Par Mihalis dans le forum Bases de données
    Réponses: 15
    Dernier message: 07/04/2006, 10h17

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