在作业上进行自我加入时遇到麻烦。自联接也从联接表rec_artist中拉出。这是我正在运行的代码,并返回一个空集。为什么我返回一个空集?
SELECT
a1.name,
a2.name,
ra.rec_id
FROM
artists a1, artists a2, rec_artist ra1, rec_artist ra2, rec_artist ra
WHERE
ra1.rec_id = ra2.rec_id
AND
ra1.artist_id = a1.id
AND
ra2.artist_id = a2.id
AND
ra1.artist_id > ra2.artist_id;
表架构:
recordings
rec_title (varchar)
rec_id (Primary Key)
sales (dec)
genre_id (Foreign Key)
genres
id (primary key)
name (varchar)
artists
id (primary key)
name (varchar)
rec_artist (junction table)
artist_id (primary key)
rec_id (primary key)
问题是:
列出至少有一个共同录音的艺术家对。
您的结果集必须包含3列:艺术家的姓名和他们在其中的record_id 常见(仅使用一条SQL语句)。
仅应显示唯一对。
不要将艺术家与他/她自己配对。
答案 0 :(得分:1)
此查询不应返回空结果。它实际上应该返回巨大的结果。您正确地找到了有共同录音的几对艺术家,但是由于没有条件,每对将与每一个 rec_id
复制在rec_artists
表中在rec_artists ra
子句的WHERE
表中。
您不需要与rec_artists
进行第三次联接。您只需从自联接的rec_id
表中的任何一个中选择rec_artists
列即可;自ra1.rec_id = ra2.rec_id
起使用哪个都没关系。
正确的查询是:
SELECT a1.name, a2.name, ra1.rec_id
FROM artists a1, artists a2, rec_artist ra1, rec_artist ra2
WHERE ra1.rec_id = ra2.rec_id
AND ra1.artist_id = a1.id
AND ra2.artist_id = a2.id
AND ra1.artist_id > ra2.artist_id;
或使用ANSI JOIN语法:
SELECT a1.name, a2.name, ra1.rec_id
FROM rec_artist AS ra1
JOIN rec_artist AS ra2 ON ra1.rec_id = ra2.rec_id AND ra1.artist_id > ra2.artist_id
JOIN artists AS a1 ON ra1.artist_id = a1.id
JOIN artists AS a2 ON ra2.artist_id = a2.id