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

Bases de données Delphi Discussion :

requête sql avec jointure


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    requête sql avec jointure
    Bonjour à tous
    J'ai une base de données fireBird qui comporte 3 tables : C_OPERATION, C_TYPE, C_CATEGORIE

    la requête suivante fonctionne très bien :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Form15.IBQuery1.SQL.Text:='SELECT O.*,'    
                              +'T.NOM_TYPE,'
                              +'C.NOM_CATEGORIE '
                              +'FROM C_OPERATION O '
                              +'INNER JOIN C_TYPE T ON O.ID_TYPE=T.ID_TYPE '
                              +'INNER JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE '
                              +'WHERE ID_COMPTE=1';

    mais la requête suivante ne fonctionne plus :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Form15.IBQuery1.SQL.Text:='SELECT O.*,'     // assign new SQL expression
                              +'T.NOM_TYPE,'
                              +'C.NOM_CATEGORIE '
                              +'FROM C_OPERATION O '
                              +'INNER JOIN C_TYPE T ON O.ID_TYPE=T.ID_TYPE '
                              +'INNER JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE '
                              +'WHERE ID_COMPTE=1'
                              +'AND ID_TYPE=5';  // Rajout uniquement de cette condition


    J'obtiens le message d'erreurr suivant :



    Je sèche de puis quelques jours. Merci de vos suggestions

    JLouis

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    Il faut spécifier par l'alias de table quelle est la colonne qui doit être utilisé.

    O.ID_TYPE ou T.ID_TYPE, je pense que
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Form15.IBQuery1.SQL.Text:='SELECT O.*,'     // assign new SQL expression
                              +'T.NOM_TYPE,'
                              +'C.NOM_CATEGORIE '
                              +'FROM C_OPERATION O '
                              +'INNER JOIN C_TYPE T ON O.ID_TYPE=T.ID_TYPE '
                              +'INNER JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE '
                              +'WHERE O.ID_COMPTE=1'
                              +'AND O.ID_TYPE=5';

    sera plus explicite
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre du Club
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Il faut spécifier par l'alias de table quelle est la colonne qui doit être utilisé.

    O.ID_TYPE ou T.ID_TYPE, je pense que
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Form15.IBQuery1.SQL.Text:='SELECT O.*,'    
                              +'T.NOM_TYPE,'
                              +'C.NOM_CATEGORIE '
                              +'FROM C_OPERATION O '
                              +'INNER JOIN C_TYPE T ON O.ID_TYPE=T.ID_TYPE '
                              +'INNER JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE '
                              +'WHERE O.ID_COMPTE=1'
                              +'AND O.ID_TYPE=5';

    sera plus explicite
    J'ai essayé avec
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    'WHERE O.ID_COMPTE=1'
    +'AND O.ID_TYPE=5'


    Je n'ai plus de message d'erreur, mais la requête ne renvoie aucun résultat alors que je suis sûr qu'il y a des résultats.

    JLouis

  4. #4
    Rédacteur/Modérateur

    j'ai l'impression qu'il manque un espace
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    'WHERE O.ID_COMPTE=1 '
    +'AND O.ID_TYPE=5'

    cette concaténation de chaine n'aide pas trop

    je préfère nettement un
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Form15.IBQuery1.SQL.Text:='SELECT O.*,T.NOM_TYPE,C.NOM_CATEGORIE ';
    Form15.IBQuery1.SQL.Add('FROM C_OPERATION O');
    Form15.IBQuery1.SQL.Add('INNER JOIN C_TYPE T ON O.ID_TYPE=T.ID_TYPE');
    Form15.IBQuery1.SQL.Add('INNER JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE');
    Form15.IBQuery1.SQL.Add('WHERE O.ID_COMPTE=1 AND O.ID_TYPE=5');

    Plus facile à lire
    et encore mieux une requête paramétrée
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Form15.IBQuery1.SQL.Add('WHERE O.ID_COMPTE=:IDC AND O.ID_TYPE=:IDT');
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd