sql - 连接多个表(多对多关系)

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

我有这个数据库图表:

enter image description here

我试图创建一个查询,在这些表之间执行一些联接并产生如下结果:

||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

关于sql - 连接多个表(多对多关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369441/

相关文章:

php - 按日期顺序连接两个表并显示结果

sql - 在 select 语句中删除数据并将其拆分为多列

sql-server - 如何将文本文件导入MSSQL

sql-server - 当我更新/插入一行时,它是否应该锁定整个表?

mysql - GROUP BY 子句中整数的含义

java - 涉及 JOIN 查询的 DAO

MySQL加入: Conditions in WHERE or in ON (2)

php - MySQL PHP 选择 "X,Y"位于 X,Y,Z 中的位置

sql - 有效查询连续天数记录

sql - 将 CSV 文件导入 postgres - 跳过前 3 行