在SQLite数据库中加入3个表

我在SQLite数据库中有3个表:

歌曲:

_id | name | length | artist_id (foreign key) | album_id (foreign key) 

艺术家:

 _id | name 

专辑:

 _id | name 

我需要一个包含以下列的表的查询(在Android应用程序中使用它):

 _id | name | length | artist_id | artist_name | album_id | album_name 

但是,我写了以下查询语句:

 SELECT Songs._id, Songs.name, Songs.length, Songs.artist_id, Artists.name, Songs.album_id, Albums.name FROM Songs, Artists, Albums WHERE Songs.artist_id = Artists._id AND Songs.album_id = Albums._id 

但它给了我一张空桌子。 我尝试了OR而不是AND并且它给出了不正确的结果(每首歌中的每首歌都重复,尽管艺术家是正确的)。 如何修复查询语句以将3个表连接到单个表中?

Solutions Collecting From Web of "在SQLite数据库中加入3个表"

使用显式JOIN而不是隐式JOIN ,以下应该得到你想要的,虽然很奇怪你的隐式连接语法首先没有返回正确的结果。 我使用LEFT JOIN来计算没有相关艺术家或专辑的歌曲,但这可能不是您的数据集所必需的,而是可以使用INNER JOIN

我还添加了列别名以消除获取行时的歧义,因为在大多数表中都有类似的列名( id, name )。

 SELECT Songs._id AS song_id, Songs.name AS song_name, Songs.length, Songs.artist_id AS artist_id, Artists.name AS artist_name, Songs.album_id AS album_id, Albums.name AS album_name FROM Songs LEFT JOIN Artists ON Songs.artist_id = Artists._id LEFT JOIN Albums ON Songs.album_id = Albums._id 

尝试这个选择,可能由Artists比其他人更重要,因此Songs来自Songs ArtistsAlbums

 SELECT Songs._id AS song_id, Songs.name AS song_name, Songs.length, Songs.artist_id AS artist_id, Artists.name AS artist_name, Songs.album_id AS album_id, Albums.name AS album_name FROM Artists LEFT JOIN Songs ON Songs.artist_id = Artists._id LEFT JOIN Albums ON Songs.album_id = Albums._id 

此外,如果属于特定艺术家的Songs没有条目或属于特定歌曲的Albums没有条目,则由于LEFT JOIN ,您仍然可以获得艺术家条目。 如果您只想返回有歌曲和专辑的艺术家,请改用JOIN

尝试sql内连接

  inner join Artists on Songs.artist_id = Artists._id