1

これは簡単なはずですが、適切なクエリを作成したり、同等の状況を見つけたりすることができませんでした。結合したいテーブルが3つあるとしましょう:Artist、、、。(実際、私はこれらのテーブルを持っていませんが、私が使用しているテーブルには同等の関係があります。)AlbumTrack

それぞれartistが多くalbumのsを持つalbumことができ、それぞれが多くのsを持つことができますtrack

artistテーブルにはインデックスが付けられており、artist_idアーティストに関する情報(、、、など)が含まれていnameます。addressphone number

albumテーブルはとにインデックスが付けartist_idられますalbum_id。アルバムの名前とその他の情報(、、など)が含まれていrecording dateますlocation

テーブルは、、、およびでtrackインデックス付けされます。トラックの名前、長さなどが含まれています。artist_idalbum_idtrack_nbr

私がやろうとしているのは、次のようなレポートを作成することです。

Artist|Album|Track#|Track Name
The Wizard of Frobozz|Zork I|01|The White House
The Wizard of Frobozz|Zork I|02|Eaten by a Grue
The Wizard of Frobozz|Zork I|03|Take the Sword
The Wizard of Frobozz|Zork I|04|Don't Forget the Lantern
The Wizard of Frobozz|Zork II|01|Waiting for the Volcano Gnome
The Wizard of Frobozz|Zork II|02|On the Left Bank of Zork
The Wizard of Frobozz|Zork II|03|In the Oddly Angled Room

artistalbumテーブルを結合してすべてを取得できますが、テーブルalbumsを追加すると、-の組み合わせごとtrackに1つしか取得できません。trackalbumartist

これは機能するはずですが、機能しません。

select a.name, l.album, t.track_nbr, t.track_name
from track t, album l, artist a 
where t.artist_id = l.artist_id
and l.artist_id = a.artist_id
and t.album_id = a.album_id
order by a.name, l.album, t.track_nbr;

私の推測では、結合を明示的に宣言し、場合によっては結合をグループ化するために括弧を追加する必要がありますが、これを行うために完全に理解できるドキュメントを見つけることができませんでした。

だから...助けますか?ありがとう!

4

3 に答える 3

2
 SELECT a.name, l.album, t.track_nbr, t.track_name
 FROM artist a
 LEFT JOIN album l ON a.artist_id = l.artist_id
 LEFT JOIN track t ON t.album_id = a.album_id
 ORDER BY a.name, l.album, t.track_nbr;

データベース設計関連の質問:なぜあなたはartist_idテーブルにいるのtrackですか?は、このトラックが属するartist_idによってすでに定義されています。album

于 2012-04-23T17:45:43.813 に答える
1
select a.name,
    l.album,
    t.track_nbr,
    t.track_name
from track t
inner join album l on t.album_id = l.album_id
inner join artist a on l.artist_id = a.artist_id
order by a.name,
    l.album,
    t.track_nbr;
于 2012-04-23T17:49:10.730 に答える
1

これはすべきではありません:

and t.album_id = a.album_id

実はこれ?

and t.album_id = l.album_id

また、3番目のWHERE句は実際に必要なものよりも多いと思います。私はこれがトリックを行うと思います:

select a.name, l.album, t.track_nbr, t.track_name
from track t, album l, artist a 
where t.album_id = l.album_id
and l.artist_id = a.artist_id
order by a.name, l.album, t.track_nbr;

アルバムテーブルがalbum_idとartist_idでインデックス付けされていると言うとき、正確にはどういう意味ですか?テーブルartist_idの主キーに含めていますか?albumにはすでに一意の値があるため、これは不要ですalbum_id

于 2012-04-23T17:57:39.980 に答える