首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接多个表(多对多关系)

连接多个表(多对多关系)
EN

Stack Overflow用户
提问于 2013-01-17 06:58:39
回答 2查看 5.4K关注 0票数 2

我有这个数据库图表:

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

代码语言:javascript
复制
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2|| 

(最后四列代表类型和能力的名称,没有它们的ID。另外,类型#2和/或能力#2可能是空的,这取决于口袋妖怪)

我完全被卡住了。我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2013-01-17 07:02:36

您将想要从连接表开始:

代码语言:javascript
复制
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表达式的聚合函数来透视数据:

代码语言:javascript
复制
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

代码语言:javascript
复制
 max(case when t.typeid = 1 then t.type end)
                          ^-- replace with your actual value
票数 3
EN

Stack Overflow用户

发布于 2013-01-17 07:06:08

您可能想要改变您的方法,让您的数据库查询返回如下内容:

代码语言:javascript
复制
||name_|| ||Type|| ||Ability||

而不是

代码语言:javascript
复制
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2|| 

换句话说,以记录(行)而不是列的形式返回类型和功能。有关这一点,请参见蓝脚查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14369441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档