如何修复相关子查询(postgresql)中的变量

如何修复相关子查询(postgresql)中的变量,sql,postgresql,Sql,Postgresql,最近学习了SQL,我对一个特定的相关子查询有一个问题 SELECT a.* FROM videos a WHERE EXISTS (SELECT NULL FROM actors b WHERE a.actor not ilike b.actor and a.title ilike ('%' + b.actor + '%')); 本质上,我希望在视频表中找到所有标题中包含演员姓名但未标记为该视频中的条目。上面的代码只返回表中的每个视频,我猜这是因为子查询在两行中使用的不是相同的“b.actor

最近学习了SQL,我对一个特定的相关子查询有一个问题

SELECT a.*
FROM videos a
WHERE EXISTS
(SELECT NULL
FROM actors b
WHERE a.actor not ilike b.actor
and a.title ilike ('%' + b.actor + '%'));

本质上,我希望在视频表中找到所有标题中包含演员姓名但未标记为该视频中的条目。上面的代码只返回表中的每个视频,我猜这是因为子查询在两行中使用的不是相同的“b.actor”。我怎样才能改变它来真正做我想做的事?提前感谢。

首先,使用
|
而不是
+
来连接字符串。 然后,我将使用
LEFT JOIN
查找视频和演员之间的正确关系,在视频ID上使用
groupby
,并使用
array\u agg(..)收集演员ID(如果有):

您可以使用
HAVING
从结果集中删除包含空参与者的行。或者只使用“内部连接”来获取至少具有适当连接的视频:

select
  v.id as video_id,
  array_agg(a.id) actors_ids
from videos v
join actors a on 
  v.title ilike ('%' || a.actor || '%')
  and v.actor not ilike a.actor
group by 1
;
最后,如果您的表很大,那么使用
ILIKE
的整个方法将非常缓慢。而且不严格——在很多情况下,你会有错误的匹配(比如“约翰”会匹配“约翰纳森”)


考虑规范化()并使用EAV模型()或整数数组或JSONB数据类型。

SQL中的字符串连接运算符是
|
而不是
+
select
  v.id as video_id,
  array_agg(a.id) actors_ids
from videos v
join actors a on 
  v.title ilike ('%' || a.actor || '%')
  and v.actor not ilike a.actor
group by 1
;