在 postgreSQL 中使用 WHERE 子句连接三个表的最有效方法是什么
What the most efficient way to make a three tables JOIN with a WHERE clause in postgreSQL
我正在使用 postgreSQL 9.3。
我想说我的问题有点主观,但我没有找到任何相关的问题或文章...
我有如下三个 table:
艺术家:
+--------+----------+
|artistId| name |
+--------+----------+
| 1 | James |
| 2 | Jack |
| 3 | Henry |
| 4 | Tom |
+--------+----------+
流派:
+---------+-----------+
| genreId | name |
+---------+-----------+
| 1 | rock |
| 2 | dub |
+---------+-----------+
和结 table 艺术家流派:
+--------+---------+
|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 会将它们重新排序为它认为最有效的顺序。
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'
);
我正在使用 postgreSQL 9.3。
我想说我的问题有点主观,但我没有找到任何相关的问题或文章...
我有如下三个 table:
艺术家:
+--------+----------+
|artistId| name |
+--------+----------+
| 1 | James |
| 2 | Jack |
| 3 | Henry |
| 4 | Tom |
+--------+----------+
流派:
+---------+-----------+
| genreId | name |
+---------+-----------+
| 1 | rock |
| 2 | dub |
+---------+-----------+
和结 table 艺术家流派:
+--------+---------+
|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 会将它们重新排序为它认为最有效的顺序。
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'
);