私はこのデータベース図を持っています:

これらのテーブル間でいくつかの結合を実行し、次のような結果になるクエリを作成しようとしていました。
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2||
(最後の 4 列は、タイプと能力の名前を表し、ID はありません。また、タイプ #2 および/または能力 #2 は、ポケモンによっては null の場合があります)
私は完全に立ち往生しています。どうすればいいですか?
私はこのデータベース図を持っています:

これらのテーブル間でいくつかの結合を実行し、次のような結果になるクエリを作成しようとしていました。
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2||
(最後の 4 列は、タイプと能力の名前を表し、ID はありません。また、タイプ #2 および/または能力 #2 は、ポケモンによっては null の場合があります)
私は完全に立ち往生しています。どうすればいいですか?
テーブルを結合することから始めたいと思うでしょう:
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
結合構文を学習するのに助けが必要な場合は、 join の優れた視覚的説明があります。
これにより、すべての名前とそのタイプと能力のリストが表示されます。
取得した値を列に回転させたい場合は、集計関数と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
アプローチを変更して、データベース クエリが次のようなものを返すようにすることもできます。
||name_|| ||Type|| ||Ability||
それ以外の
||name_|| ||Type # 1|| ||Type #2|| ||Ability #1|| ||Ability #2||
つまり、タイプとアビリティを列ではなくレコード (行) として返します。これについては、bluefeet クエリを参照してください。