1

这似乎应该很容易,但我还没有设法创建正确的查询或找到等效的情况。假设我有 3 个要加入的表:ArtistAlbumTrack。(实际上我没有这些表,但我正在使用的表具有等效关系。)

每个artist可以有很多albums,每个album可以有很多tracks。

artist表已编入索引artist_id并包含有关艺术家的信息(nameaddressphone number等)。

album表在artist_id和上编制索引album_id。它包含专辑名称和其他信息(recording datelocation等)。

track表在artist_idalbum_id和上编制索引track_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只能得到一个。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_idtrack表中?artist_id已通过album该轨道所属的定义。

于 2012-04-23T17:45:43.813 回答
1

这不应该:

and t.album_id = a.album_id

居然是这个?

and t.album_id = l.album_id

另外,我相信第三个 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_idalbum表的主键中?这是多余的,因为您已经在album_id.

于 2012-04-23T17:57:39.980 回答
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 回答