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

Songs:

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

Artists:

_id | name

Albums:

_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

但它给了我一张空桌子.我try 了OR首而不是AND首,但结果不正确(每首歌都在每张专辑中重复,尽管艺术家是正确的).如何修复查询语句,将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

Database相关问答推荐

如何在维护数据库模型的同时从Firestore中删除文档?

使用存储过程从子表中删除数据

为什么Hibernate会为@JoinTable的双向@OneToMany关系生成一个复杂的子查询?

Kusto:从一个表中复制行并追加到同一集群中的另一个表中

如何在Ballina中的事务失败时回滚缓存插入操作

即使将enable_seqscan设置为关闭,也未使用数组列上的 GIN 索引?

Membase 和 Couchbase 有什么区别?

使用 PHPUnit 进行数据库测试的最佳实践

构建具有多个数据库实例或仅单个实例的 Web 应用程序

将图像文件存储在 Mongo 数据库中,这是个好主意吗?

South migration error: NoMigrations exception for django.contrib.auth

每个 Docker 容器一个或多个数据库

我如何知道何时索引列以及使用什么索引?

为什么在 Hibernate 中不推荐hibernate.connection.autocommit = true?

单父实体的核心数据性能

cURL 和 PHP 显示1

ORM 还是Vietnam of Computer Science吗?

MySQL 整数 0 与 NULL

标准化人类皮肤 colored颜色 以进行用户交互

在 SQL Server 中实施审计表的建议?