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

Accès aux données Discussion :

SubSonic et Sqlite - Jointures difficiles


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Mjm
    Mjm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Par défaut SubSonic et Sqlite - Jointures difficiles
    Merci pour cette belle présentation.

    J'ai bien sur fait des tests avec Sqlite et une base de test, tous les essais faits avec vos exemples fonctionnent sauf les jointures, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ConsultCollection Consultation = DB.Select()
                        .From<Consult>()
                        .InnerJoin<Patient>()
                        .InnerJoin(Patient.Nu_IdColumn , Consult.Nu_IdColumn)
                        .Where(Consult.Columns.Taille).IsGreaterThan(160)
                        .And(Consult.Columns.Poids).IsLessThan(50)
                        .ExecuteAsCollection<ConsultCollection>();
    et le message d'erreur
    SQLite error
    ambiguous column name: main.PATIENTS.NU_ID
    Comment éviter cela (sans refaire la base bien entendu )

  2. #2
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Salut,

    essaye en enlevant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .InnerJoin(Patient.Nu_IdColumn , Consult.Nu_IdColumn)
    Sinon, si tu veux, le plus simple, sur ce style de pb, c'est de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SubSonic.SqlQuery query = DB.Select()
                        .From<Consult>()
                        .InnerJoin<Patient>()
                        .InnerJoin(Patient.Nu_IdColumn , Consult.Nu_IdColumn)
                        .Where(Consult.Columns.Taille).IsGreaterThan(160)
                        .And(Consult.Columns.Poids).IsLessThan(50);
     
    // en assumant que tu as une factory qui gére les logs, ça te permets
    // d'avoir le contenu de la requête qui va être exécutée
    LogFactory.LogDebug(query.ToString());
     
    ConsultCollection Consultation = query.ExecuteAsCollection<ConsultCollection>();
    Apres, comme je suis nul en Sqlite

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  3. #3
    Mjm
    Mjm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Par défaut
    Merci de votre réponse

    Malheureusement je n'ai pas eu de temps pour refaire des essais approfondis.
    Mais les solutions proposées ne fonctionnent pas mieux. Il y a indiscutablement un InnerJoin en trop (le premier sans paramètres, le second est par contre indispensable pour lier les tables).
    (Je n'ai pas pu logger la requête)
    voici la requête SQL (Simpliste juste écrite pour tester votre article)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select * From consults
    Inner Join Patients  On Patients.NU_ID = Consults.Nu_Id
    Where Consults.Taille>160
    And(Consults.Poids)<50
    Merci encore ne vous cassez pas la tête je "m'amusais" simplement alléché par votre article sur Subsonic.
    Quand à Sqlite je ne connaissais pas spécialement, mais je devais faire une extraction d'une assez grande base et comme je devais travailler sur ce sous-ensemble très simple (statistiques) cela est très pratique car la "base", le logiciel permettant les requêtes (sqlLite admin) tiennent sur une clé USB qui peut facilement être emportée chez les biostatisticiens avec qui je travaille. De plus Sqlite peut être 'travaillé' en natif par Python 2.5 qui tient aussi sur la même clé USB, que du bonheur.
    Voilà le pourquoi du comment de Sqlite
    Merci encore et bonne soirée
    mjm
    Les tests sans innerjoin fonctionnent super, mais du SQL sans jointures euh

  4. #4
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Alors, j'insiste, ca marche chez moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     SubSonic.SqlQuery query = DB.Select()
                        .From<Consult>()
                       // .InnerJoin<Patient>()
                        .InnerJoin(Patient.ConsultIdColumn, Consult.IdColumn)
                        .Where(Consult.Columns.Taille).IsGreaterThan(160)
                        .And(Consult.Columns.Poids).IsLessThan(50);
     
            Response.Write(query.ToString());
     
          var col = query.ExecuteAsCollection<ConsultCollection>();
            foreach (var cons in col)
            {
                Response.Write(cons.Nom + "<br/>");
            }
    Si tu mets a la fois la ligne .InnerJoin<Patient>() et .InnerJoin(Patient.ConsultIdColumn, Consult.IdColumn), ton sql va ressembler a ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select * From consults
    Inner Join Patients  On Patients.NU_ID = Consults.Nu_Id
    Inner Join Patients  On Patients.NU_ID = Consults.Nu_Id
    Where Consults.Taille>160
    And(Consults.Poids)<50
    J'ai attache la solution dont je me suis servi pour tester, ca devrait marcher
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip Web.zip (454,0 Ko, 83 affichages)

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  5. #5
    Mjm
    Mjm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Par défaut
    Bonsoir,
    Il ne fallait vraiment pas te donner autant de peine, bien sûr ton exemple fonctionne car les noms des champs clés sont différents, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .InnerJoin(Patient.ConsultIdColumn, Consult.IdColumn)
    et moi j'ai (donné par Subsonic, car les nom des champs sont identiques dans les 2 tables Nu_Id)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .InnerJoin(Patient.Nu_IdColumn,Consult.Nu_IdColumn)
    Et erreur
    SQLite error ambiguous column name: main.PATIENTS.NU_ID
    , c'est le IdColumn qui coince.
    Merci
    mjm

Discussions similaires

  1. Erreur difficile a resoudre [SQLITE DATABASE]
    Par bza88 dans le forum Android
    Réponses: 1
    Dernier message: 19/06/2013, 16h24
  2. sqlite c# jointure
    Par yuriyan dans le forum SQLite
    Réponses: 2
    Dernier message: 26/07/2010, 11h42
  3. efficacité et jointure sqlite
    Par marco tonio dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/07/2009, 15h31
  4. SQLite et jointures
    Par poncet2 dans le forum SQLite
    Réponses: 1
    Dernier message: 31/07/2007, 07h57
  5. Jointures SQLite ? Help
    Par InDaWinD dans le forum SQLite
    Réponses: 2
    Dernier message: 02/05/2006, 10h22

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