在postgreSQL中使用WHERE子句创建三个表JOIN的最有效方法是什么

时间:2015-04-04 11:04:55

标签: postgresql junction-table

我正在使用postgreSQL 9.3。

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

我有三张表如下:

艺术家:

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

流派:

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

和交联表artistGenres:

+--------+---------+
|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');

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

2 个答案:

答案 0 :(得分:3)

一般情况下,最好不要使用子查询,如果可以使用连接完成。但是运气不错,查询计划程序会将子查询重写为您的联接!如果你自己做的话,这就是它的样子。

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会将它们重新排序为它认为最有效的方式。

答案 1 :(得分:0)

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