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

HyperFileSQL Discussion :

Requête SQL Crash


Sujet :

HyperFileSQL

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut Requête SQL Crash
    Bonjour,

    J'utilise une BDD hyperfile (en client/serv). J'ai ma requete qui va bien et qui fonctionne qui a entre autre une condition présence = 1 (bool) Ce que je veux maintenant c'est également présence = 0 donc naturellement j'utilise OR.
    mais cette dernière crash mon CCHF. Voici ma requête

    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
    SELECT DISTINCT 
    	FORMATIONS.FOR_Libelle AS FOR_Libelle,	
    	FORMATIONS.FOR_DuréeValidité AS FOR_DuréeValidité,	
    	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM AS DateAcquisition_FORM,	
    	PERSONNEL.PE_NomPrenom AS PE_NomPrenom,	
    	PERSONNEL.SE_Code AS SE_Code,	
    	PERSONNEL.PE_Site AS PE_Site,	
    	PERSONNEL.PE_FFonction AS PE_FFonction,	
    	SERVICES.SE_Libelle AS SE_Libelle,	
    	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
    	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
    	FORMATIONS.FOR_Financement AS FOR_Financement,	
    	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
    FROM 
    	AFFECTATIONS_FORMATIONS,	
    	FORMATIONS,	
    	PERSONNEL,	
    	SERVICES
    WHERE 
    	PERSONNEL.SE_Code = SERVICES.SE_Code
    	AND		AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
    	AND		AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id
    	AND		PERSONNEL.PE_Presence = 1
            OR PERSONNEL.PE_Presence = 0
    	AND	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
    	
    ORDER BY 
    	IDFORMATIONS ASC,	
    	PE_NomPrenom ASC
    En rouge la condition que j'ajoute et qui fais planté toute la requête. Le volume de donnée n'est pas très importante, moins de 1000 enregistrement.
    Oracle et sqlServer me manque ...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il manque des parenthèses dans ta requête !
    Code SQL : 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
     
    SELECT DISTINCT 
    	FORMATIONS.FOR_Libelle AS FOR_Libelle,	
    	FORMATIONS.FOR_DuréeValidité AS FOR_DuréeValidité,	
    	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM AS DateAcquisition_FORM,	
    	PERSONNEL.PE_NomPrenom AS PE_NomPrenom,	
    	PERSONNEL.SE_Code AS SE_Code,	
    	PERSONNEL.PE_Site AS PE_Site,	
    	PERSONNEL.PE_FFonction AS PE_FFonction,	
    	SERVICES.SE_Libelle AS SE_Libelle,	
    	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
    	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
    	FORMATIONS.FOR_Financement AS FOR_Financement,	
    	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
    FROM 
    	AFFECTATIONS_FORMATIONS,	
    	FORMATIONS,	
    	PERSONNEL,	
    	SERVICES
    WHERE 
    	PERSONNEL.SE_Code = SERVICES.SE_Code
    	AND		AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
    	AND		AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id
    	AND		(PERSONNEL.PE_Presence = 1
            OR PERSONNEL.PE_Presence = 0)
    	AND	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
     
    ORDER BY 
    	IDFORMATIONS ASC,	
    	PE_NomPrenom ASC
    Sinon pour les lignes de personnel dont pe_presence = 0, le moteur ne va pas appliquer les autres condition, y compris celle concernant les jointures => produit cartésien !

    Le problème aurait été "moins grave" si tu avais utilisé des inner join pour les jointures.

    Tatayo.

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Merci Tatyo cela fonctionne. C'est dans la norme sql ces parenthèses ?
    En tous cas c'est curieux qui me l’exécute il aurait du me faire un message d'erreur de syntaxe normalement non ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Ce n'est pas un problème de norme SQL, mais d'algère bolléenne.
    Donc le moteur ne renvoie pas d'erreur car syntaxiquement ta requête est correcte. Par contre elle ne correspond pas du tout à ce que tu voulais faire.

    Soit 3 "tests" A B et C.
    A AND B OR C est vrai si C est vrai, peu importe ce que valent A et B. Ca revient à écrire (A AND B) OR C.
    A AND (B OR C) est vrai si et seulement si A est vrai ainsi que B ou C.

    Du moment qu'il y a un mélange de AND et de OR dans une condition, il faut mettre des parenthèses.

    Tatayo.

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    merci pour tes précisions, erreur stupide en somme

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Citation Envoyé par recfile Voir le message
    Bonjour,

    J'utilise une BDD hyperfile (en client/serv). J'ai ma requete qui va bien et qui fonctionne qui a entre autre une condition présence = 1 (bool) Ce que je veux maintenant c'est également présence = 0 donc naturellement j'utilise OR.
    mais cette dernière crash mon CCHF. Voici ma requête

    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
    SELECT DISTINCT 
    	FORMATIONS.FOR_Libelle AS FOR_Libelle,	
    	FORMATIONS.FOR_DuréeValidité AS FOR_DuréeValidité,	
    	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM AS DateAcquisition_FORM,	
    	PERSONNEL.PE_NomPrenom AS PE_NomPrenom,	
    	PERSONNEL.SE_Code AS SE_Code,	
    	PERSONNEL.PE_Site AS PE_Site,	
    	PERSONNEL.PE_FFonction AS PE_FFonction,	
    	SERVICES.SE_Libelle AS SE_Libelle,	
    	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
    	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
    	FORMATIONS.FOR_Financement AS FOR_Financement,	
    	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
    FROM 
    	AFFECTATIONS_FORMATIONS,	
    	FORMATIONS,	
    	PERSONNEL,	
    	SERVICES
    WHERE 
    	PERSONNEL.SE_Code = SERVICES.SE_Code
    	AND		AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
    	AND		AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id
    	AND		PERSONNEL.PE_Presence = 1
            OR PERSONNEL.PE_Presence = 0
    	AND	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
    	
    ORDER BY 
    	IDFORMATIONS ASC,	
    	PE_NomPrenom ASC
    En rouge la condition que j'ajoute et qui fais planté toute la requête. Le volume de donnée n'est pas très importante, moins de 1000 enregistrement.
    Oracle et sqlServer me manque ...
    Bonjour,

    C'est marrant mais naturellement j'aurais carrément virer la condition.... ou j'aurais mis la condition "PERSONNEL.PE_Presence is not null"....
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  7. #7
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Personnellement pour les requete je passe maintenant en inner ce qui donne pour toi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT
    	PERSONNEL.PE_FFonction AS PE_FFonction,	
    	SERVICES.SE_Libelle AS SE_Libelle,	
    	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
    	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
    	FORMATIONS.FOR_Financement AS FOR_Financement,	
    	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
    FROM AFFECTATIONS_FORMATIONS 
    inner join FORMATIONS on AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
    inner join PERSONNEL on AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id and PERSONNEL.PE_Presence in (1, 0)
    inner join SERVICES on PERSONNEL.SE_Code = SERVICES.SE_Code
    WHERE AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
    ORDER BY IDFORMATIONS ASC, PE_NomPrenom ASC
    Petite question : pourquoi as-tu besoin d'un distinct dans ta requete ?
    Emmanuel Lecoester
    => joomla addict.

Discussions similaires

  1. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  4. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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