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 :

Problème avec les jointures et between sur date


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Problème avec les jointures et between sur date
    Bonjour,

    Je débute en SQL et je commence à utiliser les jointures, mais je n'arrive plus à trier les résultats par date, alors que cela fonctionnait avec d'autres requêtes sans jointures. Le problème vient-il de la structure de ma requête?

    De plus, j'aimerais avoir votre avis concernant les deux dernières lignes, est-ce une manière correcte pour rechercher sur une base de donnée assez conséquente? Sinon, que me conseillez vous?

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT count(no_appel)
    FROM table1
    INNER JOIN table2 ON table1.c_objet = table2 .c_objet 
    WHERE table1.D_CREATION BETWEEN '30/05/16' and '05/06/16' 
    AND table1.C_OBJETSERVICE = 3 
    and table2.C_ref LIKE 'A\_%' ESCAPE '\' OR table2.C_ref LIKE 'H\_%' ESCAPE '\' 
    OR C_ref LIKE 'L\_%' ESCAPE '\' OR C_ref LIKE 'M\_%' ESCAPE '\'
    Merci d'avance pour votre temps.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour

    Je ne vois pas de clause ORDER BY dans cette requête. Cela pourrait expliquer bien des choses

    A+
    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Je ne vois pas en quoi elle pourrait m'être utile, peux-tu m'expliquer?

    Mon problème est à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE table1.D_CREATION BETWEEN '30/05/16' and '05/06/16'
    Si je fais un select sur D_CREATION avec la même requête j'obtiens toutes les dates, alors que la même clause triait correctement dans d'autres requêtes sans jointures.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Une requête fait ce qu'on lui demande. Si on veut faire un tri, il faut utiliser la clause ORDER BY.
    Si les résultat d'une requête sans cette clause te semblent triés, c'est "presque" du hasard. Ajoute des informations à ta table en choisissant aléatoirement des dates et réessaie ta requête sans ORDER BY, et tu verras.
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #5
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Je me suis peut-être mal exprimé.

    Je cherche à compter le nombre d'appel (no_appel) dont la date de création est incluse dans l'intervalle donné.

    Je travaille sur une grosse base de données et je ne dispose que des droits en lecture mais je suis sûr de ce que j'avance concernant ma clause dans mes autres requêtes.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Vos dates ne sont pas de format date, du coup le between compare des chaines de caractères, ca ne peut pas fonctionner

  7. #7
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Vos dates ne sont pas de format date, du coup le between compare des chaines de caractères, ca ne peut pas fonctionner
    Le champ D_CREATION est au format date.

    Voici un exemple de requête qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT count(no_appel) FROM ... WHERE D_CREATION BETWEEN '30/05/16'  AND '05/06/16' AND C_OBJETSERVICE = 3
    Si j'utilise la même requête avec SELECT DISTINCT D_CREATION j'obtiens seulement les dates comprises entre '30/05/16' et '05/06/16'.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Quel est votre SGBD ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Oracle

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Vu que votre requete épurée sans cette partie fonctionne (votre post de 10h35) regardez du coté de vos combinaisons AND/OR sans parenthèses

    Concernant votre question sur les perfs, la réponse est : requête défavorable aux perfs car
    - présence de prédicat "OR"
    - présence de prédicat like avec chaine de recherche très courte

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Sur Oracle, utilisez la fonction TO_DATE pour convertir EXPLICITEMENT vos chaines de caractères en date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D_CREATION BETWEEN to_date('30/05/2016','dd/mm/yyyy')  AND to_date('05/06/2016','dd/mm/yyyy')
    Ne vous fiez jamais à des conversions implicites et par ailleurs n'utilisez pas d'année sur 2 digits...

  12. #12
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Vu que votre requete épurée sans cette partie fonctionne (votre post de 10h35) regardez du coté de vos combinaisons AND/OR sans parenthèses

    Concernant votre question sur les perfs, la réponse est : requête défavorable aux perfs car
    - présence de prédicat "OR"
    - présence de prédicat like avec chaine de recherche très courte
    Merci pour ces informations, c'était bien un problème de parenthèse.

  13. #13
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Sur Oracle, utilisez la fonction TO_DATE pour convertir EXPLICITEMENT vos chaines de caractères en date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D_CREATION BETWEEN to_date('30/05/2016','dd/mm/yyyy')  AND to_date('05/06/2016','dd/mm/yyyy')
    Ne vous fiez jamais à des conversions implicites et par ailleurs n'utilisez pas d'année sur 2 digits...
    Les dates sont sous la forme suivante dans la base données 'dd/mm/yy', est ce que je dois utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D_CREATION BETWEEN to_date('30/05/2016','dd/mm/yyyy')  AND to_date('05/06/2016','dd/mm/yy')
    ?

    Je suis en stage dans une entreprise, je m'adapte donc au modèle de la base de données.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Outre les problèmes de gestion des dates (comme souvent ), La question originale était :
    mais je n'arrive plus à trier les résultats par date
    . Le trie s'effecture par ORDER BY

    Je cherche à compter le nombre d'appel (no_appel) dont la date de création est incluse dans l'intervalle donné.
    Là c'est totalement différent, cela relève de la gestion de regroupement (ok j'aurais du le voir avec l'écriture de la requête ) : clause GROUP BY.

    Mais il faudrait être plus précis sur les besoins

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT count(no_appel)
    FROM table1
    INNER JOIN table2 ON table1.c_objet = table2 .c_objet 
    WHERE table1.D_CREATION BETWEEN '30/05/16' and '05/06/16' 
    AND table1.C_OBJETSERVICE = 3 
    and table2.C_ref LIKE 'A\_%' ESCAPE '\' OR table2.C_ref LIKE 'H\_%' ESCAPE '\' 
    OR C_ref LIKE 'L\_%' ESCAPE '\' OR C_ref LIKE 'M\_%' ESCAPE '\'
    Ici, ça sort le nombre de ligne qui correspond à cette requête. En quoi cela ne donne pas le résultat attendu ?

    Pour le LIKE, je ne connais pas la syntaxe ORABLE, ni donc son mode de fonctionnement. Sur le principe, il faut vérifier les index sur c_ref et regarder le PLAN de la requête
    Merci d'ajouter un sur les tags qui vous ont aidé

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Une date est un type de donnée, elle n'a pas de format.

    Lorsque vous utilisez un outil (Toad, Sqldevelopper...) pour visualiser les données, le type de donnée date est transformé en chaine de caractère pour que vous puissiez le lire en utilisant vos paramètres de sessions par défaut.

    Pour modifier le format d'affichage de votre session, vous pouvez utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set nls_date_format='DD/MM/YYYY hh24:mi:ss';
    Vous DEVEZ modifier votre requête pour explicitement transformer vos chaines de caractères en date avec la fonction TO_DATE.
    Travailler avec une date sur 2 digit en 2016 est un non sens...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2010, 16h26
  2. Problème avec les jointures
    Par exqo77 dans le forum JDBC
    Réponses: 6
    Dernier message: 17/02/2010, 10h06
  3. Réponses: 0
    Dernier message: 29/12/2009, 11h12
  4. [MySQL] Problème avec les jointure pour un menu
    Par Glocman dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/07/2006, 17h44
  5. Réponses: 2
    Dernier message: 21/07/2005, 12h05

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