postgresql - 在 postgreSQL 中使用 WHERE 子句连接三个表的最有效方法是什么

标签 postgresql junction-table

我正在使用 postgreSQL 9.3。

我想说我的问题有点主观,但我没有找到任何相关的问题或文章...

我有如下三个表:

艺术家:

+--------+----------+
|artistId|   name   |
+--------+----------+
| 1      | James    |
| 2      | Jack     |
| 3      | Henry    |
| 4      | Tom      |
+--------+----------+

流派:

+---------+-----------+
| genreId |    name   |
+---------+-----------+
|   1     |   rock    |
|   2     |   dub     |
+---------+-----------+

和联结表艺术家流派:

+--------+---------+
|artistId| genreId |
+--------+---------+
|      1 |     1   |
|      2 |     2   |
|      3 |     1   |
|      4 |     2   |
+--------+---------+

我想按流派名称获取所有艺术家。 目前我是这样做的:

SELECT a.*
FROM artistsGenres aG
  INNER JOIN artists a ON a.artistId = aG.artistId
WHERE aG.genreId = (SELECT genreId FROM genres WHERE name = 'dub');

我想知道是否有更有效的方法来做到这一点?

最佳答案

一般来说,如果可以通过连接完成,最好不要使用子查询。然而,幸运的是,查询规划器为您重写了子查询作为连接!这是您自己制作的样子。

SELECT a.*
FROM artistsGenres aG
  INNER JOIN artists a ON a.artistId = aG.artistId
  INNER JOIN genres g ON g.genreId=aG.genreId
WHERE g.name='dub'

您执行连接的顺序并不重要,因为 postgresql 会将它们重新排序为它认为最有效的顺序。

关于postgresql - 在 postgreSQL 中使用 WHERE 子句连接三个表的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29445639/

相关文章:

php - 将日期与存储在其他列中的持续时间进行比较的 postgresql 查询

sql - 使用 pgAdmin 导入文本文件

sql - 表函数中的 PostgreSQL 参数化 Order By/Limit

ruby-on-rails - 在连接表中,Rails 缺少复合键的最佳解决方法是什么?

mysql - 数据库设计以启用像 Stackoverflow 这样的多个标签?

mysql - 没有主键的连接表

postgresql - 在 Yocto 中使用其他配方生成的文件

postgresql - 找出删除和更新的行

php - 使用 MySQL 和 PHP 显示从多个联结表获得的信息

MySQL 联结表外键