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 :

Correspondance ecriture requete


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut Correspondance ecriture requete
    Bonjour,

    Je vous soumet une question qui me turlupine....
    Tout d'abord voici la structure des 2 tables incriminées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DISPODATE
     DDATE   datetime   not null,
     DDISPO  tinyint    not null
     
     
    DISPOPOSTE
     PDATE   datetime   not null,
     POSTE   int        not null,
     PDISPO  tinyint    not null
    DISPODATE donne la disponibilité d'une semaine type (pour tous les postes), et dans DISPOPOSTE on retrouve des exceptions pour chaque poste

    voici un jeu d'essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
              DISPODATE
             DDATE         DDISPO
    Jun 16 2008 12:00AM     2
    Jun 17 2008 12:00AM     2
    Jun 18 2008 12:00AM	2
    Jun 19 2008 12:00AM	2
    Jun 20 2008 12:00AM	3
    Jun 21 2008 12:00AM	0
    Jun 22 2008 12:00AM	0
    
    
              DISPOPOSTE
             PDATE         PDISPO       POSTE
    Jun 18 2008 12:00AM	1            1
    On remarque que sur le poste 1 la disponibilité est différente de celle de la semaine type le 18 juin


    J'ai trouvé dans le produit sur lequel je travail la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select DDATE, DDISPO
    from DISPODATE,DISPOPOSTE
    where DDATE*=PDATE
    and POSTE=1
     
    resultat :
     
    Jun 16 2008 12:00AM	|
    Jun 17 2008 12:00AM	|
    Jun 18 2008 12:00AM	|  1
    Jun 19 2008 12:00AM	|
    Jun 20 2008 12:00AM	|
    Jun 21 2008 12:00AM	|
    Jun 22 2008 12:00AM	|
    La requête est réécrite en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select DDATE, DDISPO
    from DISPODATE
    left join DISPOPOSTE on DDATE=PDATE
    where POSTE=1
     
    avec ce resultat
     
    Jun 18 2008 12:00AM	|  1
    Je suis tout a fait d'accord avec le résultat retourné par la 2° écriture (jointure sur les dates et restriction sur le poste)
    Par contre, il me semblait que la requête 2 était une traduction fidèle de la 1.

    Maintenant mes interrogations...


    Qu'est ce qui change entre ces 2 écritures ?
    Pourquoi la restriction n'est pas valable dans la requête 1 ?
    Qu'elle serait alors la traduction de la requête 1 ?


    PS : SGBD utilisé = Sybase ASE 12.5

  2. #2
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut
    A ma 3° interrogation, j'ai bien une feinte permettant d'afficher les memes résultats

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DDATE, DDISPO
    FROM DISPODATE
    LEFT JOIN DISPOPOSTE ON DDATE=PDATE
    WHERE isnull(POSTE,1)=1

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Plus efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DDATE, DDISPO
    FROM DISPODATE
    LEFT JOIN DISPOPOSTE 
     ON DDATE=PDATE 
     AND POSTE=1
    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.

  4. #4
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    La difference entre les 2 ecritures la voila :

    Dans votre premier cas, vous utilisez une jointure externe (gauche) de type implicite, Sybase va donc faire une jointure avec les clauses (date et poste). D'ou la totalité de vos données.

    Dans le second cas, la jointure est dite explicite, vous definissez de maniere explicite votre condition de jointure au moteur SGBD. La jointure se fait donc uniquement sur la condition de jointure (date) et la clause where filtre l'ensemble du resultat (poste), voila pourquoi cela ne vous ramene qu'une ligne (celle qui rempli la condition de la clause WHERE).

    J'espere avoir été assez clair dans mon explication

    Bon courage

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

Discussions similaires

  1. [Toutes versions] Ecriture requete pb remonté infos
    Par Aladin_23 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/07/2011, 18h08
  2. correspondance champs requete et dataRow
    Par clouddd dans le forum ASP.NET
    Réponses: 5
    Dernier message: 09/11/2009, 14h57
  3. Ecriture requete max de la différence
    Par calou_33 dans le forum SQL
    Réponses: 2
    Dernier message: 08/11/2008, 10h58
  4. Ecriture Requete SQL auto-jointure
    Par telynor dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/05/2007, 23h50
  5. Débutant: Requetes de correspondances
    Par banker dans le forum Access
    Réponses: 1
    Dernier message: 31/01/2006, 18h05

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