2

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

ここに画像の説明を入力

これらのテーブル間でいくつかの結合を実行し、次のような結果になるクエリを作成しようとしていました。

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

(最後の 4 列は、タイプと能力の名前を表し、ID はありません。また、タイプ #2 および/または能力 #2 は、ポケモンによっては null の場合があります)

私は完全に立ち往生しています。どうすればいいですか?

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

結合構文を学習するのに助けが必要な場合は、 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
于 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 に答える