使用MULTISET来比较数据集的实例介绍

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

使用普通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) AS films,
  actors
FROM t
GROUP BY actors
ORDER BY count(*) DESC, films

复制代码

结果就是现在:

|films   |actors                            |
|--------|----------------------------------|
|{97,556}|{65}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值