2013-01-16 127 views
2

我有這個數據庫圖表:加入多個表(許多一對多關係)

enter image description here

我試圖創建一個執行這些表之間的一些連接,並導致像這樣的查詢:

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

(最後四列代表各類型和能力的名字,沒有它們的ID。此外,式#2和/或能力#2可以爲空取決於寶貝)

我完全被困住了。我應該怎麼做?

+0

您正在嘗試執行交叉表查詢。如果您可以確定關東每一行最多有兩種類型和兩種能力,那麼您可能會發現向關東簡單添加兩個Type列和兩個Ability列會更容易。另一方面,如果每行可以有無限數量的類型和能力(需要多對多結構),那麼交叉表將不適合,並且您應該在不同的查詢中訪問類型和能力。 – Tim

回答

3

你會想通過連接表開始:

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 

如果您需要幫助學習加入語法,這裏是一個偉大的visual explanation of joins

這會給你一個所有姓名,及其類型和能力的列表。

如果你想旋轉你進入列中的值,那麼你可以使用聚合函數與CASE表達數據:

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_ 

case表達式的每一個你將要識別id改造:

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

非常感謝!只有一個問題:那些'最大'是什麼? – Mudkip

+0

@Mudkip如果你想將數據從行轉換爲列,那麼你將需要使用一個聚合函數和一個大小寫來爲每個'name'選擇值。這是如何將數據從行中轉換爲列的方式。 – Taryn

+0

嘿bluefeet,再次感謝您對此查詢的幫助。順便說一下,我試着對查詢進行了一些修改,我有這樣的: select k.name_ Name, max(case(when.typeid = 1 or t.typeid = 7)then t.type端) 「類型#1」, t.type 「類型#2」, a.ability 「能力#1」, a.Ability 「能力#2」 從關東ķ 左加入kantotype克拉日k 。 pkémonid=kt.pokémonid 左連接類型t 關於kt.typeid = t。typeid的 留在k.pokémonid=ka.pokémonid 加入kantoabilityか 左連接能力上ka.abilityid = a.abilityid 組由k.name_,t.type一個 ,a.Ability (繼續向右下) – Mudkip

0

你可能想改變你的方法,讓你的數據庫查詢返回類似:

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

代替

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

換句話說,返回類型和能力爲記錄(行),而不是列。爲此,請參閱bluefeet查詢。