这似乎应该很容易,但我没有设法创建正确的查询或找到一个等效的情况。假设我有3个我想加入的表:Artist
,Album
和Track
。 (实际上我没有这些表,但我正在使用的表具有相同的关系。)
每个artist
可以有多个album
,每个album
可以有多个track
。
artist
表已在artist_id
上编入索引,其中包含有关艺术家的信息(name
,address
,phone number
等。
album
表已在artist_id
和album_id
上编入索引。它包含相册的名称和其他信息(recording date
,location
等)。
track
表已在artist_id
,album_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
我可以加入artist
和album
表来获取所有albums
但是当我添加track
表时,我只得到一个track
每album
- artist
组合。
这似乎应该可行,但不会:
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;
我的猜测是我需要显式声明一个连接并可能添加括号来对连接进行分组,但是我无法找到我可以完全理解的文档来执行此操作。
所以......帮帮忙?谢谢!
答案 0 :(得分: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
定义。
答案 1 :(得分: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;
答案 2 :(得分: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_id
表的主键中包含album
?这是多余的,因为您已在album_id
中拥有唯一值。