我如何简化这个PostgreSQL查询(通过连接表过滤)

时间:2017-12-22 04:52:35

标签: sql postgresql

我们说我有一个角色(有很多)电影的关系。

我想通过角色名称和电影标题来过滤我的结果。所以我想要归还所有名字都像是' Sam'并且该角色必须至少在一部电影中,其中电影标题就像是电影中的电影'。 我仍然希望所有与角色相关联的电影

我只是想知道是否有更好的方法来做到这一点?是否可以在一个查询中获取它?

WITH t1 AS 
(SELECT c.id, c.name, array_agg(m.title) AS movie_titles FROM characters c
LEFT JOIN characters_movies cm ON cm.character_id = c.id
LEFT JOIN movies m ON m.id = cm.movie_id
WHERE c.name LIKE '%Sam%'
GROUP BY c.id)

SELECT * FROM t1 WHERE exists 
(SELECT * FROM unnest(movie_titles) AS title
WHERE name LIKE '%Sam the Movie%')

1 个答案:

答案 0 :(得分:0)

在一个查询中,它将是这样的(不能在没有ddl的情况下进行测试)。请注意我是如何使用不同的别名加入电影两次的。与m的加入可确保您在标题上匹配。第二个am是获得所有头衔。我非常确定不需要使用LEFT JOIN来获得您想要的结果,因此我使用了普通的JOIN,这往往更有效率。

SELECT c.id, c.name, array_agg(am.title) AS movie_titles 
  FROM characters c
    JOIN characters_movies cm ON cm.character_id = c.id
    JOIN movies m ON (m.id = cm.movie_id AND m.name LIKE '%Sam the Movie%')
    JOIN characters_movies acm ON acm.character_id = c.id
    JOIN movies am ON (am.id = acm.movie_id)
WHERE c.name LIKE '%Sam%'
GROUP BY c.id