2013-08-11 5 views
0

J'ai trois tables comme suit:SQL select - un à plusieurs à plusieurs

m(id INT, name TEXT) 
tn(id INT, name TEXT, valueid INT) 
tv(valueid INT, name TEXT) 

Dans le tableau m il n'y a que des entrées uniques. La table 'tn' contiendra au moins une valeur qui correspond au champ m.id, généralement il y en a beaucoup. Enfin, la table 'tv' a de nombreuses valeurs qui sont associées à la table tn en utilisant le champ valueid. Le résultat serait de pouvoir choisir une valeur dans la table m trouver sa valeur correspondante dans la table 'tn' comme si m.id = tn.id. Enfin, j'ai besoin de sortir toutes les valeurs tv qui s'associent au champ tn.valueid.

sortie serait quelque chose comme si

foo host bar 
foo host foobar 
bar host1 foo 

Si la colonne 1 est de m.name, colonne 2 est de tn.name et de la colonne 3 de tv.names. Pour chaque entrée dans tv.names se traduira par une nouvelle ligne de sortie pour ma requête.

Mise à jour:

Jusqu'à présent, j'ai pu construire la première requête qui me permet de choisir le nom unique en m et ses valeurs associées à tn.name:

select m.name, tn.name from m, tn where m.id = tn.id and m.id = 128; 

J'ai besoin pour étendre cela à inclure la troisième table et limiter le choix par le champ valueid dans les deux autres tables.

Merci.

+0

Alors, qu'avez-vous essayé? – elias

Répondre

1

Garder votre notation actuelle, vous pouvez ajouter la troisième table en utilisant la même approche:

select m.name, tn.name, tv.name 
    from m, tn, tv 
where m.id = tn.id 
    and tn.valueid = tv.valueid 
    and m.id = 128 
; 

Cependant, je pense que la plupart des gens considèrent aujourd'hui qu'il vaut mieux utiliser la jointure ANSI notation, ce qui est plus explicite:

SELECT m.name, tn.name, tv.name 
    FROM m 
    JOIN tn ON tn.id = m.id 
    JOIN tv ON tv.valueid = tn.valueid 
WHERE m.id = 128 
; 

(Il est plus explicite en ce que certaines conditions vont dans ON spécifiques clauses, précisant la nature de la jointure, plutôt que de mettre tout dans une grande clause WHERE.)

Questions connexes