2

我有这个数据库图:

在此处输入图像描述

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

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

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

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

4

2 回答 2

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

如果您在学习连接语法方面需要帮助,这里有一个很好的 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
于 2013-01-16T23:02:36.490 回答
0

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

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

代替

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

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

于 2013-01-16T23:06:07.817 回答