SQL查询动作类最短时长影片无返回结果问题排查
问题排查及解决方案
核心问题排查点
- 字符串大小写匹配错误:你插入的
category表中动作分类的name值为Action(首字母大写),但查询条件中写的是全大写'ACTION',Oracle数据库的varchar2类型字符串比较默认区分大小写,这是导致查询无返回的直接原因。 - 业务逻辑不符合需求:你当前的SQL按
title分组,会返回所有Action分类影片的各自时长(单条影片的最小时长就是自身时长),无法筛选出最短时长的影片。 - 连接逻辑冗余:此处仅需筛选有关联关系的分类、影片关联记录,使用内连接即可,不需要右连接。
修复后的查询语句
通用兼容写法(适用于所有Oracle版本)
先计算Action分类的最短时长,再匹配对应影片,可同时返回多部时长同为最小值的影片:
SELECT f.title, f.length FROM film f JOIN film_category fc ON f.film_id = fc.film_id JOIN category c ON fc.category_id = c.category_id WHERE c.name = 'Action' AND f.length = ( SELECT MIN(f2.length) FROM film f2 JOIN film_category fc2 ON f2.film_id = fc2.film_id JOIN category c2 ON fc2.category_id = c2.category_id WHERE c2.name = 'Action' );
Oracle 12c+ 简化写法
SELECT f.title, f.length FROM film f JOIN film_category fc ON f.film_id = fc.film_id JOIN category c ON fc.category_id = c.category_id WHERE c.name = 'Action' ORDER BY f.length ASC FETCH FIRST 1 ROWS WITH TIES;
说明:
WITH TIES参数会返回所有时长等于最短值的影片,避免存在多部最短影片时漏查数据。
内容的提问来源于stack exchange,提问作者HY2000
相关产品推荐
相关产品推荐

