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

Développement SQL Server Discussion :

Liaison table complexe


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut Liaison table complexe
    Bonsoir,

    j'ai plusieurs table
    - site_am_export_fichier_mairies
    - site_am_export_fichier_mairies_membres_elus
    je veux récupérer tous les champs de ces deux tables
    j'ai une liaision (site_am_export_fichier_mairies.ID et site_am_export_fichier_mairies_membres_elus.ID_MAIRIE)
    donc mon select est ok avec un inner join

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  site_am_export_fichier_mairies.*,  
    site_am_export_fichier_mairies_membres_elus.FONCTION AS FONCTION_MEMBRE, 
    site_am_export_fichier_mairies_membres_elus.CIVILITE AS CIVILITE_MEMBRE, 
    site_am_export_fichier_mairies_membres_elus.PRENOM AS PRENOM_MEMBRE, 
    site_am_export_fichier_mairies_membres_elus.NOM AS NOM_MEMBRE
    FROM site_am_export_fichier_mairies 
    INNER JOIN site_am_export_fichier_mairies_membres_elus ON site_am_export_fichier_mairies.ID = site_am_export_fichier_mairies_membres_elus.ID_MAIRIE 
    WHERE (site_am_export_fichier_mairies.ID IS NOT NULL)
    mon souci :

    il faudrait que je récupère le champs "date_naissance" dans une 3eme table (am3_personne), mais sans liaison avec les deux précédentes
    si ce n'est en passant par deux autres tables car dans la table site_am_export_fichier_mairies_membres_elus, j'ai un champs : "id_type_personne" que je retrouve dans la table "am3_relation_personne_entite"
    et dans la table "am3_relation_personne_entite" j'ai un champs "id_personne" que je retrouve dans la table "am3_personne"

    en faisant comme ça la requête tourne mais n’aboutis pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT  site_am_export_fichier_mairies.*,  
    site_am_export_fichier_mairies_membres_elus.FONCTION AS FONCTION_MEMBRE, 
    site_am_export_fichier_mairies_membres_elus.CIVILITE AS CIVILITE_MEMBRE, 
    site_am_export_fichier_mairies_membres_elus.PRENOM AS PRENOM_MEMBRE, 
    site_am_export_fichier_mairies_membres_elus.NOM AS NOM_MEMBRE, 
    am3_personne.date_naissance DATE_NAISSANCE_MEMBRE 
    FROM site_am_export_fichier_mairies 
    INNER JOIN site_am_export_fichier_mairies_membres_elus ON site_am_export_fichier_mairies.ID = site_am_export_fichier_mairies_membres_elus.ID_MAIRIE 
    INNER JOIN am3_relation_personne_entite ON am3_relation_personne_entite.id_type_personne = site_am_export_fichier_mairies_membres_elus.id_type_personne 
    INNER JOIN am3_personne ON am3_personne.id_personne = am3_relation_personne_entite.id_personne 
    WHERE (site_am_export_fichier_mairies.ID IS NOT NULL)
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    La requete tourne mais n'aboutit pas, qu'est ce à dire ?

    Quel est le message d'erreur

    PS : des noms de table comme "site_am_export_fichier_mairies_membres_elus " c'est super pratique pour les requetes, vous pourrez remercier le concepteur, et pourquoi pas "site_am_export_fichier_mairies_membres_elus _en_2015_au_deuxieme_tour_avec_plus_de_60_pourcent_des_inscrits_et_sans_fraude_electorale_averee"

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut
    Bonjour,

    Oui, je sais un grand bonheur ces noms ...
    ça va taper dans des tables avec des centaines de milliers d'enregistrements donc la requête tourne mais ne m'affiche pas les résultats

    edit :
    je viens de me rendre compte que la table site_am_export_fichier_mairies_membres_elus est issue d'une vue
    il ne serait pas plus simple de modifier la vue en ajoutant la colonne supplémentaire (date_naissance) à la vue qui sera répercuté dans la table site_am_export_fichier_mairies_membres_elus ?
    c'est sous sql server 2005 et je suis sur studio express
    je ne l'ai jamais fait donc la crainte de faire une boulette ...
    lorsque j'ouvre la vue dans studio express (clique droit / modifier), j'ai 3 volets . Celui du bas affiche la requete, est dans dans celui là où je peux ajouter la nouvelle colonne ?

    Merci encore de votre aide

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Donc il s'agit d'un souci de performances, auquel cas communiquez le DDL de vos index avec les infos sur les volumes de chaque table et le facteur de filtrage des colonnes d'index.
    Dans l'intervalle, vérifiez que vos colonnes de jointure sont bien de même type et de même longueur

    A priori le filtre WHERE (site_am_export_fichier_mairies.ID IS NOT NULL) devrait être inutile : si ID est bien l'identifiant primaire de la table site_am_export_fichier_mairies, par définition, il ne peut être null. Du coup votre requete fait un table scan de cette table puisque where non filtrant.

    Remplacez aussi site_am_export_fichier_mairies.*, par la liste des colonnes utiles de la table, ce sera toujours ça de moins à véhiculer sur le réseau, et rendra le résultat de votre requête stable, quelque soient les évolutions de la table. Faire un select * sur une requête qui comporte des jointures conduit à minima à transporter 2 fois les colonnes de jointures, c'est quand même ballot

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut
    Merci pour votre réponse
    entre-temps j'ai édité mon message avec un nouvel élément : une vue
    l'avez vous vu ?
    j'ai vu qu'on pouvait faire un ALTER VIEW de la vue
    donc dans le volet sql de la vue je peux récupérer la requête de la vue et y ajouter la nouvelle colonne et faire un ALTER VIEW de cette requête ?

    et est ce que je dois ajouter au préalable la colonne DATE_NAISSANCE dans la table (issue de la vue gestionsite.site_am_export_fichier_mairies_membres_elus) : fichierenligne.site_am_export_fichier_mairies_membres_elus ?

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas ce critère de jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN am3_relation_personne_entite ON am3_relation_personne_entite.id_type_personne = site_am_export_fichier_mairies_membres_elus.id_type_personne
    Êtes-vous sûr qu'il n'y a pas une seconde colonne qui doit entrer en jeu ?
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Je me permets de me citer moi-même et tant pis pour le diamètre de mes chevilles

    Citation Envoyé par escartefigue Voir le message
    Donc il s'agit d'un souci de performances, auquel cas communiquez le DDL de vos index avec les infos sur les volumes de chaque table et le facteur de filtrage des
    colonnes d'index.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Jointure entre 3 tables, même avec des centaines de milliers de lignes, ça doit être instantané.

    Pour moi, le "vrai" problème, c'est, au choix :
    - L'utilisation de critères de jointure foireux (un produit cartésien entre cent mille lignes et cent mille lignes, c'est tout de suite moins facile à gérer)
    - Outil de requêtage qui fait un fetch de toutes les lignes avant de ramener le résultat (et là, forcément, s'il y a quelques milliers de Mo en résultat, rien que le transport à travers le réseau, ça va prendre un peu de temps)
    - Problème de type dans les colonnes retournées (couplé au second problème). Genre la photo des élus en haute définition qui est ramenée pour chaque ligne...
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je suis d'accord avec Stringbuilder et on peut aussi ajouter la modélisation foireuse, l'absence de clef primaire et/ou d'indexation...

  10. #10
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Vous nous faites perdre notre temps.
    Merci de fournir le plan d’exécution (estimé au minimum)
    Cordialement
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Connaissez vous les alias de tables ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  M.*, --> mettez les colonnes et pas * 
    		MME.FONCTION AS FONCTION_MEMBRE, 
    		MME.CIVILITE AS CIVILITE_MEMBRE, 
    		MME.PRENOM AS PRENOM_MEMBRE, 
    		MME.NOM AS NOM_MEMBRE, 
    		P.date_naissance AS DATE_NAISSANCE_MEMBRE 
    FROM    site_am_export_fichier_mairies AS M
    		INNER JOIN site_am_export_fichier_mairies_membres_elus AS MME 
    		      ON M.ID = MME.ID_MAIRIE 
    		INNER JOIN am3_relation_personne_entite AS PE 
    		      ON PE.id_type_personne = MME.id_type_personne 
    		INNER JOIN am3_personne AS P 
    		      ON P.id_personne = PE.id_personne;
    Ainsi récrite votre requête gagne en lisibilité !

    Le WHERE est inutile et remplacez l'étoile par les colonnes.

    Indiquez nous le DDL des tables et les index posés.

    À +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 616
    Points : 177
    Points
    177
    Par défaut
    Bonjour

    et merci pour tous vos commentaires
    comme je l'ai précisé dans mon précédent post, j'ai opté pour utiliser la vue de la table site_am_export_fichier_mairies_membres_elus pour y afficher la colonne date_naissance
    pour cela j'ai modifié
    site_am_export_fichier_mairies_membres_elus en y ajoutant la colonne date_naissance
    et la vue pour qu'elle recherche date_naissance
    lors de la modification de la vue, j'ai juste modifié (alter view) la requête pour recupéré date_naissance

    et avec ma requête finale, je récupère bien tous les éléments désirés

    Merci encore pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liaison tables access
    Par Pierren dans le forum Access
    Réponses: 11
    Dernier message: 07/07/2006, 17h06
  2. Plusieurs jointures sur la meme table [complexe]
    Par Wells dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h41
  3. liaison tables
    Par DaNni dans le forum Access
    Réponses: 4
    Dernier message: 29/03/2006, 21h34
  4. Réponses: 5
    Dernier message: 15/11/2005, 08h57
  5. Liaison table / Formulaire
    Par HE dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 09h32

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