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

Delphi Discussion :

Problèmes de champs dans SQL


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 216
    Par défaut Problèmes de champs dans SQL
    Bonjour,
    Je crois avoir déjà posé cette question, sans réponse satisfaisante.
    Lorsque je fais une requête SQL genre SELECT DISTINCT <colonne) FROM <table> j'ai un message d'erreur me réclamant TOUS les champs de ma table, les uns après les autres. Au bout du compte je n'ai pas le résultat attendu !
    Voilà c'est tout.
    Merci. Cordialement

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 356
    Par défaut
    Bonjour,
    Peux-tu nous donner la requête exacte qui pose problème ?

    Tatayo.

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    Quel SGBD ?
    Quelle Version ?
    Quel Provider ?
    Quel Driver ?
    Heureusement que l'on sait cherché nous même pour avoir vos informations : Problème requête SQL

    Donc SGBD -> SQLite
    Quelle Version ?
    Quel Provider ? Zeos, FireDAC ?


    Le DISTINCT ne doit pas réclamer tous les champs mais attention au ORDER BY qui parfois peut entré en conflit, comme parfois aussi avec un GROUP BY

    C'est un DISTINCT pour les doublons d'une seule table ou pour éliminer les cardinalités parasites générés par une jointure ?

    Faudrait d'abord construire la requête sur les outils SQLite et consulter les experts concernées dans Forum > Bases de données > Autres SGBD > SQLite car il faut différencier si c'est une problème DELPHI (lié au Provider et d'un éventuel Parser de SQL) d'un problème de restriction SQL de SQLite voir même un problème sur la table elle-même, peut-être la nécessité d'avoir un Index.

    Comment est déclaré aussi la Query, est-ce créée à la volée ou créée en Design Time avec des champs persistants (à éviter au maximum)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 540
    Billets dans le blog
    65
    Par défaut
    C'est bien SQLite et a priori Firedac (en regardant dans le forum SQLite)
    AMHA, une erreur de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT colonnea,colonneb.... FROM <table>
    fonctionne

    Maintenant, tout dépend de ce qui est voulu
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 216
    Par défaut
    SGBD : Sqlite
    Version : 3 et quelques
    provider : Zeos
    Driver : ?????

    La requête devrait être celle-ci :
    SELECT DISTINCT Num_operation FROM tblJournal

    Je cherche à éliminer les doublons dans <Num_operation>, rôle typique du DISTINCT. Mais je dois lister tous les champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Datas.QJournal do
      begin
        SQL.Clear;
        SQL.Text := 'SELECT DISTINCT Num_operation, Label, Journee, Nom, Montant_credit, Montant_debit, Print, Imputation, Nomen FROM QJournal'; //éventuellement ORDER BY Num_operation
        Open;;
    end;
    Bien sûr, le résultat me donne tous les enregistrements, doublons compris.

    Comment est déclaré aussi la Query, est-ce créée à la volée ou créée en Design Time avec des champs persistants (à éviter au maximum)
    J'ignore ce que cela veut dire, excusez-moi !

    Merci.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    SGBD : Sqlite
    Version : 3 et quelques
    provider : Zeos
    Driver : ?????
    Finalement ce n'est pas FireDac mais Zeos, on avait une chance sur deux avec SQLite

    On n'a d'ailleurs pas le message d'erreur ni le nom de l'exception, cela aiderait pourtant aussi à faire le diagnostic
    Est-ce une Notification d'Exception ou une Exception d'ailleurs ?

    Citation Envoyé par f5jcg_Lulu Voir le message
    J'ignore ce que cela veut dire, excusez-moi !
    Je devine donc la méthode des débutants avec Datas.QJournal, une Query dans un DataModule, vérifier vos champs persistants, il ne faut pas utiliser la même Query avec différents SQL si vous avez des champs persistants.

    Les champs persistants sont visibles dans le code par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QJournal: TZQuery
    QJournalNum_operation: TIntegerField;
    QJournalLabel: TStringField;
    Pour moi, il faudrait un QJournal global au SQL fixe et un QJournalDynamic pour les SQL évolutifs ... c'est pour rester simpliste si vous ne maitrisez pas l'instanciation dynamqiue.

    Vous avez le même problème avec QAdherents où vous devez utiliser la même Query pour plusieurs SQL, puisque vous avez ce même problème en 2020.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 540
    Billets dans le blog
    65
    Par défaut
    Zeos j'étais persuadé qu'il s'agissait de Firedac.

    Si la requête est
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Num_operation FROM tblJournal
    et que cela demande les autres champs alors c'est que ces champs ont été déclarés

    Une solution sans supprimer ces déclarations : faire une jointure

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT D.Num_operation,
    j.Label,j.Journee, j.Nom, j.Montant_credit, j.Montant_debit, j.Print, j.Imputation, j.Nomen
     FROM QJournal D LEFT JOIN QJournal J on J.Num_operation=D.num_operation
    Mais je ne pense pas que ce soit le résultat voulu
    Je cherche à éliminer les doublons dans <Num_operation>, rôle typique du DISTINCT.
    pour extraire les doublons ce n'est pas DISTINCT que j'utiliserai je pense plutôt à un GROUP BY HAVING dans quelque chose comme ça
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WITH D as (SELECT Num_operation FROM QJournal GROUP BY num_operation HAVING  Count(num_operation)>1)
    SELECT D.Num_operation,
    j.Label,j.Journee, j.Nom, j.Montant_credit, j.Montant_debit, j.Print, j.Imputation, j.Nomen
     FROM QJournal D LEFT JOIN QJournal J on J.Num_operation=D.num_operation
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 216
    Par défaut
    Et voilà la solution qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Datas.QJournal do
    begin
      SQL.Clear;
      SQL.Text := 'SELECT DISTINCT Num_operation, Label, Journee, Nom, Montant_credit, Montant_debit, Print, Imputation, Nomen FROM tblJournal GROUP BY Num_operation';
      Open;
    end;
    Mon erreur était d'utiliser ORDER BY au lieu de GROUP BY. J'ai bien 13 enregistrements avec des <Num_operation> différents sur 22 enregistrements au total. J'ai donc bien ce que je cherchais.

    Merci à tous pour m'avoir orienté de suggestion en suggestion.
    Cordialement.

  9. #9
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 356
    Par défaut
    Tu as "de la chance" qu'elle fonctionne, car elle sera rejetée par une grosse majorité de SGBD.

    DISTINCT dédoublonne les lignes du résultat, "mais" il se base sur l'intégralité des colonnes du SELECT, pas seulement sur celle qui suit le DISTINCT.

    Si SqlLite n'aime pas les CTE, il y a une solution avec une jointure, mais il faut connaître la clé primaire de la table.

    Tatayo.

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Tu as "de la chance" qu'elle fonctionne, car elle sera rejetée par une grosse majorité de SGBD.
    On se demande d'ailleurs ce que contiennent les autres colonnes hors du GROUP BY, je ne connais pas non plus de SGBD qui supporte DISTINCT et GROUP BY ensemble

    Je ne comprends même pas ce que cela retourne comment le DISTINCT s'applique par dessus le GROUP BY ?
    Cela prend la première valeur au pifomètre dans les autres colonnes ?
    GROUP BY sans fonction d'agrégat (MIN, MAX, SUM, COUNT, AVG) ... en fait le but même de la requête et du sens de la donnée me semble peu clair

    Par curiosité :
    Est-ce que SANS le DISTINCT, cela émet une erreur réclamant des fonction d'agrégat pour satisfaire le GROUP BY ?

    Si oui, SQLITE doit considérer le DISTINCT comme disjoncteur du GROUP BY pour renvoyer un résultat même si il n'a pas vraiment de logique.


    Bonus théorique, je n'ai ni SQLite ni Zeos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Datas.QJournal do
    begin
      SQL.Clear;
      SQL.Text := 'SELECT Num_operation, GROUP_CONCAT(DISTINCT Label || ''-'') as Label, GROUP_CONCAT(DISTINCT Journee || ''-'') as Journee, GROUP_CONCAT(DISTINCT Nom || ''-'') as Nom, GROUP_CONCAT(DISTINCT Montant_credit || ''-'') as Montant_credit, GROUP_CONCAT(DISTINCT Montant_debit || ''-'') as Montant_debit, GROUP_CONCAT(DISTINCT Print || ''-'') as Print, GROUP_CONCAT(DISTINCT Imputation || ''-'') as Imputation , GROUP_CONCAT(DISTINCT Nomen || ''-'') as Nomen FROM tblJournal GROUP BY Num_operation';
      Open;
    end;
    Version Hors Delphi a tester sur SQLite en direct
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
      Num_operation
    , GROUP_CONCAT(DISTINCT Label || '-') as Label
    , GROUP_CONCAT(DISTINCT Journee || '-') as Journee
    , GROUP_CONCAT(DISTINCT Nom || '-') as Nom
    , GROUP_CONCAT(DISTINCT Montant_credit || '-') as Montant_credit
    , GROUP_CONCAT(DISTINCT Montant_debit || '-') as Montant_debit
    , GROUP_CONCAT(DISTINCT Print || '-') as Print
    , GROUP_CONCAT(DISTINCT Imputation || '-') as Imputation
    , GROUP_CONCAT(DISTINCT Nomen || '-') as Nomen 
    FROM tblJournal 
    GROUP BY Num_operation
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 216
    Par défaut
    Bonjour,
    De retour pour dire que la solution de ShaiLeTroll "Version Hors Delphi a tester sur SQLite en direct" fonctionne parfaitement sans modifications.
    Testée dans Delphi elle fonctionne également mais ne fait pas mieux que ma solution, même si celle-ci paraît "exotique" et ne devrait pas fonctionner. Mystère ?
    J'ai également une autre solution pour joindre 2 tables et en extraire les champs communs et qui fonctionne elle aussi parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Datas.QNomenclature do
    begin
      SQL.Clear;
      SQL.Text := 'SELECT DISTINCT Num_compte, Label_compte, TotalActif, TotalPassif, Imputation_compte FROM tblNomenclature INNER JOIN tblJournal WHERE tblNomenclature.Num_compte = tblJournal.Num_operation';
      Open;
     end;
    Enfin, question de candide : qu'est-ce que des champs déclarés et, à contrario, qu'est-ce que des champs non déclarés ? Juste pour le plaisir de savoir.
    Je garde tous vos bouts de code car ils me sont très utiles pour avancer dans mes connaissances.
    Merci pour vos efforts.
    Cordialement

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    On n'a d'ailleurs pas le message d'erreur ni le nom de l'exception, cela aiderait pourtant aussi à faire le diagnostic
    .
    Si l'on en revient au début, nous n'avons toujours pas cette information la classe d'Exception et le message d'erreur !
    C'est dommage ne pas communiquer cela.


    Citation Envoyé par f5jcg_Lulu Voir le message
    Bonjour,
    De retour pour dire que la solution de ShaiLeTroll "Version Hors Delphi a tester sur SQLite en direct" fonctionne parfaitement sans modifications.
    Testée dans Delphi elle fonctionne également mais ne fait pas mieux que ma solution, même si celle-ci paraît "exotique" et ne devrait pas fonctionner. Mystère ?
    Vu que je n'ai jamais fait de SQLite, je suis content de savoir qu'elle fonctionne

    Elle retourne tout de même un résultat plus complet en concaténant les valeurs uniques de chaque colonne, vous devriez quand même voir une différence en particulier sur Montant_credit, Montant_debit.
    Et pourquoi dites vous que c'est un Mystère et qu'elle ne devrait pas fonctionner, c'est justement une version avec uniquement des fonctions d'aggrégats pour satisfaire le GROUP BY, elle a un sens de cumul de donnés uniques.
    C'est SQLite qui est trop permissif par rapport à la norme SQL ou DISTINCT GROUP BY n'a pas cohérence.


    Pour moi cet abus de DISTINCT indique une problématique de construction de la Base ou des requêtes au sens douteux, si ça fonctionne avec SQLite, vous avez effectivement de la chance, cela n'est pas le cas en SQL Server et DISTINCT c'est rarissime.

    A mon avis, il y a un travail de fond sur le sens de la donnée affichée voir même du modèle des tables qui n'est peut-être pas assez découpé en Master-Detail

    Ceci me choque par exemple tblNomenclature.Num_compte = tblJournal.Num_operation, une jointure avec des champs avec des noms différents, un compte peut avoir plusieurs opérations comptable, là on devine une structure étrange.


    Citation Envoyé par f5jcg_Lulu Voir le message
    Enfin, question de candide : qu'est-ce que des champs déclarés et, à contrario, qu'est-ce que des champs non déclarés ? Juste pour le plaisir de savoir.
    J'ai fourni dans ma réponse précédente les liens sur la documentation, je n'utilise JAMAIS de champs persistants (champs déclarés) donc je ne peux pas t'en dire plus, c'est juste plus pratique pour les débutants.
    Si tu utilises FieldByName, tu utilises des champs dynamiques (champs non déclarés) sans le savoir alors.

    Citation Envoyé par ShaiLeTroll Voir le message
    vérifier vos champs persistants, il ne faut pas utiliser la même Query avec différents SQL si vous avez des champs persistants.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 540
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    Enfin, question de candide : qu'est-ce que des champs déclarés
    Clic droit sur le composant requête et sélectionne Editeur de champs. S'il y en a alors tu as des champs déclarés.
    NB . Il faudrait aussi vérifier si les colonnes de la grille, car je présume qu'il y a grille, sont définies ou pas.

    je note quand même une drôle de chose, cette fois ta solution utilise Datas.QNomenclature alors qu'avant il s'agissait de Datas.QJournal

    pour en revenir à la requête group by d'hier 14h30, SQLite est très permissif quelque chose comme ceci fonctionne
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select id,nom,prenom from tableAuteurs group by nom
    un SGBD respectant plus les normes NON
    D'ailleurs tu remarqueras qu'il n'y a même pas besoin de DISTINCT pour donner un même résultat

    Pour moi, la demande de départ
    je cherche à éliminer les doublons dans <Num_operation>
    reste floue j'ai l'impression que ce n'est pas vraiment le bon terme, d'ailleurs quel serait la "bonne" ligne à sortir en cas de doublon ?

    exemple :
    j'ai id nom prenom
    1000 Herbert Franck
    1001 Herbert Brian
    1002 Anderson Kevin J.
    donc deux Herbert, dois-je "éliminer " Frank ou Brian ? de mon résultat

    Si je veux Herbert Brian et Anderson Kevin J. alors voici le SQL
    WITH a as (SELECT NOM,MAX(id) id FROM tableauteurs GROUP BY nom)
    select a.nom,p.prenom from A LEFT JOIN tableAuteurs P on p.id=a.id
    a contrario si je veux Franck
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH a as (SELECT NOM,MIN(id) id FROM tableauteurs GROUP BY nom)
    select a.nom,p.prenom from A LEFT JOIN tableAuteurs P on p.id=a.id

    Suggestion, on peut même améliorer en indiquant le nombre de doublons
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH a as (SELECT NOM,MIN(id) id,Count(1) doublons FROM tableauteurs GROUP BY nom)
    select a.nom,p.prenom,a.doublons from A LEFT JOIN tableAuteurs P on p.id=a.id


    Au fait, oui, j'utilise une forme de SQL que l'on nomme CTE, elle peut se faire sans mais c'est AMHA moins lisible comme SQLite le permet autant l'utiliser
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    reste floue j'ai l'impression que ce n'est pas vraiment le bon terme, d'ailleurs quel serait la "bonne" ligne à sortir en cas de doublon ?
    C'est aussi ce que je me demande depuis le début, c'est au pifomètre

    Pour moi ce n'est pas des doublons mais simuler un master à partir du détail, suite à un défaut de structure de tables

    GROUP_CONCAT récupère les deux sur une seule ligne

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select  nom, GROUP_CONCAT(DISTINCT  prenom || ',') as prenoms
    GROUP BY nom

    ou

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select  nom, GROUP_CONCAT(prenom, ',') as prenoms
    GROUP BY nom


    Citation Envoyé par SergioMaster Voir le message
    D'ailleurs tu remarqueras qu'il n'y a même pas besoin de DISTINCT pour donner un même résultat
    J'ai la réponse à ma question à ma curiosité


    Citation Envoyé par SergioMaster Voir le message
    j'ai id nom prenom
    1000 Herbert Franck
    1001 Herbert Brian
    1002 Anderson Kevin J.
    Ah je vois qu'il y a de bonne référence, pour un autre sujet SQLite, c'est marrant, j'ai choisi les mêmes ... non parce ShaiLeTroll c'est pu tout lié à Shaï-Hulud ... va mettre un ï dans une adresse mail, il a disparu alors.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  15. #15
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 475
    Par défaut
    salut

    après le utilise le
    having Count(..) > 1
    cela te donnera les doublons ensuite a toi de voir ce que tu veut en faire
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag :resolu:

  16. #16
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 216
    Par défaut
    Si l'on en revient au début, nous n'avons toujours pas cette information la classe d'Exception et le message d'erreur !
    Il n'y a pas de message d'exception et le message d'erreur réclame juste les champs les uns après les autres jusqu'à tous les mentionner dans la requête. C'est tout. Une fois que je liste la totalité des champs le message disparaît.

    Ceci me choque par exemple tblNomenclature.Num_compte = tblJournal.Num_operation, une jointure avec des champs avec des noms différents, un compte peut avoir plusieurs opérations comptable, là on devine une structure étrange.
    J'avais donné le même nom au champ des 2 tables qui portent les mêmes valeurs, seulement je me retrouvais avec un message d'alerte sur ambiguité entre les 2 champs. Après en avoir renommé un, l'ambiguité a été levée.
    En fait je remplis le champ <Num_operation> de la table tblJournal avec des comptes choisis dans la table tblNomenclature qui contient la totalité des comptes dont je peux avoir besoin, d'où son nom.

    select id,nom,prenom from tableAuteurs group by nom
    Cette solution ne fonctionne pas chez moi. Pourquoi ?

    Pour revenir sur les doublons, peu importe dans mon cas quel enregistrement est sélectionné par le DISTINCT. Ce qu'il me faut c'est 1 doublon de chaque dont je garde le numéro du compte et le libellé de ce compte. Et pour cela, ma requête fait bien son boulot.

    Et merci pour la réponse sur les champs déclarés (ou pas).

  17. #17
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    Il n'y a pas de message d'exception et le message d'erreur réclame juste les champs les uns après les autres jusqu'à tous les mentionner dans la requête. C'est tout. Une fois que je liste la totalité des champs le message disparaît..
    Qui réclame ?
    Comment ?
    Il y a bien quelques chose qui s'affiche pour réclamer !

    Fait un screenshot du message !

    Citation Envoyé par f5jcg_Lulu Voir le message
    Pour revenir sur les doublons, peu importe dans mon cas quel enregistrement est sélectionné par le DISTINCT. Ce qu'il me faut c'est 1 doublon de chaque dont je garde le numéro du compte et le libellé de ce compte. Et pour cela, ma requête fait bien son boulot.
    C'est clairement un manque de table master detail qui éviterait la duplication de données, c'est un défaut du modèle DB
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 540
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    Cette solution ne fonctionne pas chez moi. Pourquoi ?
    Version de SQLite ? la mienne : 3.47.1
    test effectués via SQLite Studio 3.4.10

    Du coup si la solution ne fonctionne pas, peut-être que ta version de SQlite ne permet pas non plus les CTEs
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  19. #19
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 216
    Par défaut
    C'est tout simple, il m'est facile de (re)produire le message d'erreur : il suffit de retirer l'un quelconque des noms de champs dans la requête SQL

    Nom : message.jpg
Affichages : 121
Taille : 8,5 Ko

    et ainsi de suite jusqu'à que tous les champs soient listés dans la requête. Naturellement je n'attends pas que les messages se succèdent, je liste d'emblée tous les champs.

    Pour Serge, je viens de télécharger Sqlite version 3.49.1 et Sqlite Studio est la version 3.4.17. J'ai essayé ta requête (celle sans Distinct) et ça fonctionne avec la dernière version de Sqlite.

  20. #20
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 961
    Par défaut
    Probablement donc un EDatabaseError avec le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SFieldNotFound = 'Champ '#39'%s'#39' non trouvé';
    Il y a quelques part dans votre code où vous utiliser un FieldByName à l'ouverture du DataSet, ou le Scroll ... et encore une fois, on n'a toujours pas eu confirmation si vous aviez des champs persistants ou non, qui sont probablement une cause de cette erreur.

    Genre dans le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QNomenclature: TZQuery;
    QNomenclatureNum_compte: TIntegerField;
    QNomenclatureLabel_compte: TStringField;
    QNomenclatureTotalActif: TFloatField;
    QNomenclatureTotalPassif: TFloatField;
    QNomenclatureImputation_compte: TIntegerField;
    ou un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QNomenclature.FieldByName('Imputation_compte')
    dans un gestionnaire d'évènement ou après le Open


    Citation Envoyé par f5jcg_Lulu Voir le message
    Pour Serge, je viens de télécharger Sqlite version 3.49.1 et Sqlite Studio est la version 3.4.17. J'essaierai avec ta requête.
    Cela ne changera rien, c'est une erreur dans votre utilisation de la même Query QJournal ou QNomenclature avec différents SQL, en plus probablement lié à un DataSource ensuite ...
    Si vous utilisiez comme recommandé une nouvelle Query isolée, le problème disparaitrait ... le même qu'en 2020.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Concaténation de champs dans SQL Server
    Par helio500 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/04/2011, 16h14
  2. [interbase][SQL] concatener 2 champs dans le select
    Par Harry dans le forum Bases de données
    Réponses: 10
    Dernier message: 09/03/2006, 07h45
  3. Champ de type "Image" dans SQL Server
    Par Edouard Kaiser dans le forum ASP
    Réponses: 5
    Dernier message: 09/09/2005, 08h43
  4. 2 champs dans un where , possible en sql server ?
    Par voyageur dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 19/10/2004, 06h01
  5. [SQL] Renommer un champ dans une requête
    Par martonpylon12 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/11/2003, 02h59

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