多表搜索去重需求:关联双表获取不重复的TableA电影数据
解决双表搜索电影数据重复的问题
解决你遇到的重复记录问题,有几种实用的办法:
1. 使用DISTINCT去重
这是最直接的方案,在SELECT语句中添加DISTINCT关键字,自动过滤掉JOIN后产生的重复电影记录:
SELECT DISTINCT a.* FROM TableA a LEFT JOIN TableB b ON a.Movie_code = b.Movie_code WHERE a.Movie_code LIKE ? OR a.Movie_Name LIKE ? OR a.Company LIKE ? OR b.Actor_Name LIKE ?
绑定%SearchTerm%参数后,就能确保返回的每条电影数据都是唯一的,适合数据量不大的场景。
2. 使用EXISTS子查询(推荐,性能更优)
不需要关联整个演员表,而是检查当前电影是否存在匹配的演员记录,从根源避免重复:
SELECT a.* FROM TableA a WHERE a.Movie_code LIKE ? OR a.Movie_Name LIKE ? OR a.Company LIKE ? OR EXISTS ( SELECT 1 FROM TableB b WHERE b.Movie_code = a.Movie_code AND b.Actor_Name LIKE ? )
这种方式不会产生JOIN带来的笛卡尔积,查询效率更高,尤其适合演员表数据量较大的情况。
3. 使用IN子查询
逻辑和EXISTS类似,先通过子查询找出匹配演员的电影编码,再筛选TableA的记录:
SELECT a.* FROM TableA a WHERE a.Movie_code LIKE ? OR a.Movie_Name LIKE ? OR a.Company LIKE ? OR a.Movie_code IN ( SELECT b.Movie_code FROM TableB b WHERE b.Actor_Name LIKE ? )
实际效果和EXISTS相近,具体性能差异取决于数据库优化器的处理逻辑。
验证效果
- 搜索"a":4部电影都会被匹配(自身字段或关联演员含"a"),返回4条唯一记录;
- 搜索"Huppert":匹配到ABx1和TR55两部电影,返回2条记录;
- 搜索"Afterglow":仅匹配到YU9的电影名,返回1条记录。
内容的提问来源于stack exchange,提问作者CMArg
相关产品推荐
相关产品推荐

