加入多个表(多对多关系)

时间:2013-01-16 22:58:39

标签: sql sql-server join many-to-many

我有这个数据库图表:

enter image description here

我试图创建一个在这些表之间执行某些连接的查询,结果如下:

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

(最后四列代表类型和能力的名称,没有他们的ID。另外,类型#2和/或能力#2可能为空,具体取决于神奇宝贝)

我完全陷入困境。我该怎么做?

2 个答案:

答案 0 :(得分: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表达式的聚合函数来 pivot 数据:

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

答案 1 :(得分:0)

您可能希望更改方法并让数据库查询返回如下内容:

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

而不是

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

换句话说,将类型和能力作为记录(行)而不是列返回。为此,请参阅bluefeet查询。