2013-01-16 6 views
2

Je ce schéma de base de données:Unir plusieurs tables (plusieurs à plusieurs)

enter image description here

je tentais de créer une requête qui effectue une jointures entre ces tables et le résultat à quelque chose comme ceci:

||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2|| 

(les quatre dernières colonnes représentent les types et des capacités de noms, pas leur carte d'identité. de plus, le type 2 et/ou la capacité # 2 peut être nulle selon le pokémon)

Je suis complètement coincé. Comment dois-je faire cela?

+0

Vous essayez d'effectuer une requête de tabulation croisée. Si vous pouvez être sûr que chaque rangée de Kanto a au plus deux types et deux capacités, vous trouverez probablement plus facile d'ajouter simplement deux colonnes Type et deux colonnes Capacité à Kanto. D'un autre côté, si chaque rangée peut avoir un nombre illimité de types et d'aptitudes (nécessitant la structure plusieurs-à-plusieurs), un tableau croisé sera de toute façon inadapté, et vous devrez accéder aux types et capacités dans des requêtes séparées. – Tim

Répondre

3

Vous allez vouloir commencer en joignant les tables:

select k.name_, 
    t.type, 
    a.ability 
from kanto k 
left join kantotype kt 
    on k.pokemonid = kt.pokemonid 
left join types t 
    on kt.typeid = t.typeid 
left join kantoability ka 
    on k.pokemonid = ka.pokemonid 
left join abilities a 
    on ka.abilityid = a.abilityid 

Si vous avez besoin de syntaxe se joindre à l'apprentissage de l'aide, voici un grand visual explanation of joins.

Ceci vous donnera une liste de tous les noms, et de leur type et capacité.

Si vous souhaitez faire pivoter les valeurs que vous obtenez en colonnes, vous pouvez utiliser une fonction d'agrégation avec une expression CASE-pivot les données:

select k.name_, 
    max(case when t.typeid = 1 then t.type end) Type1, 
    max(case when t.typeid = 2 then t.type end) Type2, 
    max(case when a.abilityid = 1 then a.ability end) Ability1, 
    max(case when a.abilityid = 2 then a.ability end) Ability2 
from kanto k 
left join kantotype kt 
    on k.pokemonid = kt.pokemonid 
left join types t 
    on kt.typeid = t.typeid 
left join kantoability ka 
    on k.pokemonid = ka.pokemonid 
left join abilities a 
    on ka.abilityid = a.abilityid 
group by k.name_ 

Dans chacun des case expressions que vous voudra identifier le id à transformer:

max(case when t.typeid = 1 then t.type end) 
          ^-- replace with your actual value 
+0

Merci en effet! juste une question: à quoi servent ces 'max'? – Mudkip

+0

@Mudkip Si vous souhaitez transformer les données des lignes en colonnes, vous devrez utiliser une fonction d'agrégation avec un cas pour sélectionner la valeur de chaque 'nom'. C'est ainsi que vous faites pivoter les données dans des colonnes à partir de lignes. – Taryn

+0

Hey bluefeet, merci encore pour votre aide sur cette requête. Par ailleurs, j'ai essayé quelques modifications sur la requête, et j'ai quelque chose comme ceci: sélectionnez k.name_ Name, max (cas où (t.typeid = 1 ou t.typeid = 7) puis t.type fin) "type # 1", t.type "type # 2", a.ability "Capacité # 1", a.Ability "Capacité # 2" de Kanto k left join kantotype kt sur k. pokémonid = kt.pokémonid types de jointure gauche t sur kt.typeid = t.typeid gauche rejoindre kantoability ka sur k.pokémonid = ka.pokémonid jointure gauche capacités un sur ka.abilityid = a.abilityid groupe par k.name_, t.type, a.Ability (continuez à droite ci-dessous) – Mudkip

0

Vous pouvez modifier votre approche et votre retour de requêtes base de données quelque chose comme:

||name_|| ||Type|| ||Ability|| 

au lieu de

||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2|| 

En d'autres termes, les types de retour et de capacités enregistrements (lignes) au lieu de colonnes. Pour cela, voir la requête bluefeet.

Questions connexes