我正在使用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');
我想知道是否有更有效的方法来做到这一点?
答案 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'
);