Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Discussion: Requête SQL Crash

  1. #1
    Invité régulier
    Développeur informatique
    Inscrit en
    novembre 2012
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2012
    Messages : 26
    Points : 5
    Points
    5

    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 :
    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 Confirmé Sénior
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 2 307
    Points : 4 637
    Points
    4 637

    Par défaut

    Bonjour,
    Il manque des parenthèses dans ta requête !
    Code SQL :
    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
    Invité régulier
    Développeur informatique
    Inscrit en
    novembre 2012
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2012
    Messages : 26
    Points : 5
    Points
    5

    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 Confirmé Sénior
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 2 307
    Points : 4 637
    Points
    4 637

    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
    Invité régulier
    Développeur informatique
    Inscrit en
    novembre 2012
    Messages
    26
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2012
    Messages : 26
    Points : 5
    Points
    5

    Par défaut

    merci pour tes précisions, erreur stupide en somme

  6. #6
    Membre Expert
    Homme Profil pro Mathurin
    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    904
    Détails du profil
    Informations personnelles :
    Nom : Homme Mathurin
    Âge : 30

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2009
    Messages : 904
    Points : 1 473
    Points
    1 473

    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 :
    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"....

  7. #7
    Expert Confirmé
    Avatar de Emmanuel Lecoester
    Profil pro Emmanuel Lecoester
    Inscrit en
    février 2003
    Messages
    1 491
    Détails du profil
    Informations personnelles :
    Nom : Emmanuel Lecoester
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : février 2003
    Messages : 1 491
    Points : 3 396
    Points
    3 396

    Par défaut

    Personnellement pour les requete je passe maintenant en inner ce qui donne pour toi :

    Code :
    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
    => On recrute des rédacteurs WinDev

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •