Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1392 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] SELECT sur une table avec clé étrangère sur cette même table

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] SELECT sur une table avec clé étrangère sur cette même table

n°1855457
sieurcoug
Posté le 26-02-2009 à 11:51:22  profilanswer
 

Bonjour,
 
Je vous expose mon souci qui va vous paraître simple (vu mon niveau en SQL ;)) :
Voilà, j'ai besoin de lister les enregistrements de la table Solution, avec des infos de la table Produit. Jusque là j'ai réussi à faire avec un FULL OUTER JOIN sur ROW_ID.
 
http://img15.imageshack.us/img15/2582/tables4780733.jpg
 
La difficulté pour moi est que cette table Produit contient une arborescence sur 2 niveaux : "produit" et "famille de produits", avec la clé étrangère PAR_PROD_INT_ID qui pointe vers la colonne ROW_ID.
 
Je veux tout simplement obtenir toutes les Solutions par famille de produits (c'est-à-dire la famille de produits associée à la solution, le nom du produit ne m'intéresse pas).
 
J'arrive pas à associer deux FULL OUTER JOIN.
Qu'en pensez-vous ?

mood
Publicité
Posté le 26-02-2009 à 11:51:22  profilanswer
 

n°1855611
sieurcoug
Posté le 26-02-2009 à 16:05:02  profilanswer
 

Après recherches avec d'autres, j'ai trouvé !
 

SELECT DISTINCT
    tProd2.NAME AS Famille
FROM Solution AS tSol1
        FULL OUTER JOIN Produit AS tProd1
            ON tSol1.X_PRODUCT = tProd1.ROW_ID
        FULL OUTER JOIN Produit AS tProd2
            ON tProd1.PAR_PROD_INT_ID = tProd2.ROW_ID
WHERE ....


 
 
La subtilité pour moi était notamment de bien mentionner la 2e table de la jointure tProd2.NAME pour obtenir mon résultat.

n°1855904
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2009 à 11:43:38  profilanswer
 

Une clé étrangère qui fait référence à la clé primaire de la table à laquelle elle appartient, j'ai jamais vu ça [:what has been seen]
Pourquoi une telle aberration ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°1855914
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 11:59:56  profilanswer
 

Pour faire une arborescence comme dit plus haut. J'emploie cette technique régulièrement. Tu le ferais comment toi?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1855948
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2009 à 13:44:11  profilanswer
 

Ben j'aurais créé une table "Famille", et j'aurais défini une clé étrangère dans la table "Produit" qui référence la clé primaire de la table "Famille" :spamafote:


---------------
J'ai un string dans l'array (Paris Hilton)
n°1855992
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 14:27:38  profilanswer
 

pour le coup de la famille si la classification, c'est "une famille possède 0 ou plusieurs produits" et "un produit appartient à une seule famille", ok pour ta solution. Mais pour modéliser une arborescence "d'objets" de même types, comme tu ferais ta modélisation sans avoir de clé étrangère qui pointe sur la même table?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1856001
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2009 à 14:31:02  profilanswer
 

Ben déjà, qu'appelles tu une arborescence d'objets de même type ? Poste un exemple stp


---------------
J'ai un string dans l'array (Paris Hilton)
n°1856034
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 15:26:07  profilanswer
 

Ex : une arborescence de titres (comme dans un document Word) :
1 Titre du 1
1.1 Titre du 1.1
1.2 Titre du 1.2
2 Titre du 2
2.1 Titre du 2.1
2.1.1 Titre du 2.1.1
...
Pour faire ça en BD, j'aurais une table ayant la structure suivante :
Table "Titres"
ID (clé primaire)
Libellé  
Ordre
ParentID
 
ParentID pointe sur l'ID du titre parent et Ordre permet d'ordoner les titres d'un même niveau. Dans la table "Titres", avec mon ex, ça donnerait les lignes suivantes :
1   "Titre du 1"       1     NULL
2   "Titre du 1.1"     1      1
3   "Titre du 1.2"     2      1  
4   "Titre du 2"       2     NULL
5   "Titre du 2.1"     1      4
6   "Titre du 2.1.1"   1      5
 
Bien entendu, on n'est pas obligé de rentrer dans l'ordre d'affichage dans la table. Ordre sert justement à remettre le bon ordre d'affichage.

Message cité 1 fois
Message édité par rufo le 27-02-2009 à 15:32:25

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1856075
MagicBuzz
Posté le 27-02-2009 à 16:50:45  profilanswer
 

moi j'ai pas de problème avec la structure hiérarchique, par contre j'en ai un avec tes "full outer join".
 
t'es vraiment sûr que t'as besoin du "full outer join" ? un "left outer join" (voir un "inner join" ) ne serait pas amplement suffisant ?
 
ensuite, pour ce qui est des tables hiérérchiques, il faut utiliser l'équivalent de "connect by ... prior" d'oracle pour pouvoir les relire. avec sql server on utilise une syntaxe un peu sioux, et avec mysql... je crois que pour le moment on n'a pas d'autre choix que de faire X auto-jointures à la suite, en limitant de facto le niveau hiérérchique au nombre de jointures de la requête

n°1856082
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2009 à 17:12:06  profilanswer
 

rufo a écrit :

Ex : une arborescence de titres (comme dans un document Word) : ...)


ah ok, je voyais pas ça comme ça :jap:


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le 27-02-2009 à 17:12:06  profilanswer
 

n°1856084
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 17:17:03  profilanswer
 

Je confirme MagicBuzz, pour MySQL, effectivement, c'est pas évident de relire de genre de structure, faut faire plusieurs requêtes.
 
Après, j'avais vu une autre structure de stockage mieux adapté pour Mysql, basée sur les arbres il me semble, mais je me souviens plus trop (je crois que dans le nom de la méthode, y'avait le mot "left" )...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1856085
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2009 à 17:18:50  profilanswer
 

et sinon, pourquoi ne pas stocker l'arbre de ta hiérarchie directement dans la base, et le "déplier" dans le code client ?


Message édité par Harkonnen le 27-02-2009 à 17:19:03

---------------
J'ai un string dans l'array (Paris Hilton)
n°1856087
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 17:20:24  profilanswer
 

je suis pas sûr de comprendre ce que tu me proposes, là :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1856089
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2009 à 17:39:12  profilanswer
 

rufo a écrit :

je suis pas sûr de comprendre ce que tu me proposes, là :/


ben tu établis un arbre à partir de ta hiérarchie (pour reprendre ton exemple) :


                       D
                    /     \
                  1        2
                 /  \      /
              1.1  1.2  2.1
                          /
                        2.1.1

 

à partir de là, tu batis un fichier XML en parcourant cet arbre, de manière préfixe (noeud parent, puis noeud enfant gauche et noeud enfant droit) :

Code :
  1. <root>
  2.    <chapter value="1">
  3.       <chapter value="1.1" />
  4.       <chapter value="1.2" />
  5.    </chapter>
  6.     <chapter value="2">
  7.       <chapter value="2.1">
  8.          <chapter value="2.1.1" />
  9.       </chapter>
  10.    </chapter>
  11. </root>


tu stockes ce fichier dans ta base, et ensuite tu en fais ce que tu veux. ça t'évite des requêtes compliquées, et c'est largement plus efficace :)


Message édité par Harkonnen le 27-02-2009 à 17:40:11

---------------
J'ai un string dans l'array (Paris Hilton)
n°1856143
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2009 à 22:13:36  profilanswer
 

ah, oui, et quand ces titres ont des relations avec d'autres tables, tu fais comment sans une clé primaire pour chaque titre?
Un ex plus parlant sur lequel j'ai fais bossé MagicBuzz y'a pas loin de 2 ans. J'ai fais un soft de gestion de configurations (confs contenant du logiciel et du matériel). Une conf est constituée de composants, c'est constituants étant composés chacun d'attributs. Les composants sont organisés sous la forme d'une arborescence de composants. Il y a donc bien là une nécessité de lier les composants entre eux pour la partie arbo, lier les composants à la configuration et lier les composants aux attributs. La modélisation en XML n'est pas possible dans ce cas là ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1856229
jeca
Posté le 28-02-2009 à 11:54:35  profilanswer
 

Bonjour,
 
Sans chercher à entrer dans le détail, pour la gestion des arborescences, il y a ça :
http://sqlpro.developpez.com/cours/arborescence/


Message édité par jeca le 28-02-2009 à 11:55:28
n°1856367
rufo
Pas me confondre avec Lycos!
Posté le 28-02-2009 à 21:41:21  profilanswer
 

en fait, je crois que c'est de cette méthode dont je parlais précédemment. Merci de l'avoir retrouvée (et donc, rien à voir avec le terme "left" dans le nom)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] SELECT sur une table avec clé étrangère sur cette même table

 

Sujets relatifs
Quoi choisir => Oracle ? MySQL ? Microsoft SQL ?creation de table
[MYSQL 5] Resultat d'une procédure stockée dans une table temporaire[SSIS/SQL 2005] Utilisation de Tranasction dans un package
[SQL Server 2005]Caractère unicode non sauvé dans la DB après 1 insertUpdate SQL
[SQL] SQL Server 2000 & la différence (not exists)Hyperlien SQL Server
Sql Server Express possède t-il la fonct. de synchronisation de base ?[ACCESS]Difficulté d'execution d'une requete SQL
Plus de sujets relatifs à : [SQL] SELECT sur une table avec clé étrangère sur cette même table


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR