使用普通SQL可能更难解决的问题是这样的问题:
哪些电影与给定的电影X有相同的演员?
像往常一样,我们在这个例子中使用sakila数据库。用SQL(例如PostgreSQL,具体来说)解决这个问题的可能方式是什么?下面的查询给出了每部电影的演员概况:
SELECT film_id, array_agg(actor_id ORDER BY actor_id) actors FROM film_actor GROUP BY film_id 复制代码
它产生的结果是这样的:
|film_id|actors |
|-------|----------------------------------|
|1 |{1,10,20,30,40,53,108,162,188,198}|
|2 |{19,85,90,160} |
|3 |{2,19,24,64,123} |
|4 |{41,81,88,147,162} |
|5 |{51,59,103,181,200} |
|6 |{21,23,62,108,137,169,197} |
|... |... |
复制代码
请注意,在SQL中,数组的行为就像列表一样,也就是说,它们保持着自己的排序,所以明确地对数组进行排序对于能够相互比较演员是很重要的。现在,我们想从上面找到所有共享相同演员集的电影:
WITH t AS (
-- Previous query
SELECT
film_id,
array_agg(actor_id ORDER BY actor_id) actors
FROM film_actor
GROUP BY film_id
)
SELECT
array_agg(film_id ORDER BY film_id)

本文探讨了如何使用SQL(如PostgreSQL)的MULTISET特性来比较数据集,特别是在查找共享相同演员集的电影时。通过jOOQ 3.15的MULTISET支持,我们可以实现不依赖元素顺序的比较,简化了查询编写。文章还提供了使用MULTISET_AGG和替代方法的示例,展示了如何在比较中避免不必要的排序操作。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



