我有這個數據庫圖表:加入多個表(許多一對多關係)
我試圖創建一個執行這些表之間的一些連接,並導致像這樣的查詢:
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2||
(最後四列代表各類型和能力的名字,沒有它們的ID。此外,式#2和/或能力#2可以爲空取決於寶貝)
我完全被困住了。我應該怎麼做?
我有這個數據庫圖表:加入多個表(許多一對多關係)
我試圖創建一個執行這些表之間的一些連接,並導致像這樣的查詢:
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2||
(最後四列代表各類型和能力的名字,沒有它們的ID。此外,式#2和/或能力#2可以爲空取決於寶貝)
我完全被困住了。我應該怎麼做?
你會想通過連接表開始:
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
非常感謝!只有一個問題:那些'最大'是什麼? – Mudkip
@Mudkip如果你想將數據從行轉換爲列,那麼你將需要使用一個聚合函數和一個大小寫來爲每個'name'選擇值。這是如何將數據從行中轉換爲列的方式。 – Taryn
嘿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
你可能想改變你的方法,讓你的數據庫查詢返回類似:
||name_|| ||Type|| ||Ability||
代替
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2||
換句話說,返回類型和能力爲記錄(行),而不是列。爲此,請參閱bluefeet查詢。
您正在嘗試執行交叉表查詢。如果您可以確定關東每一行最多有兩種類型和兩種能力,那麼您可能會發現向關東簡單添加兩個Type列和兩個Ability列會更容易。另一方面,如果每行可以有無限數量的類型和能力(需要多對多結構),那麼交叉表將不適合,並且您應該在不同的查詢中訪問類型和能力。 – Tim