创建Netflix浪漫电影视图出现无关结果的问题排查请求
问题分析与解决方案
嘿,我来帮你搞定这个冗余结果的问题!咱们先拆解一下你写的视图创建语句,看看问题出在哪:
核心问题:未指定表连接条件导致笛卡尔积
你写的FROM DB2020_genre, DB2020_MOVIEINFO, DB2020_ON_NETFLIX这种多表写法,没有添加任何连接条件,数据库会默认做「笛卡尔积」——也就是把三个表的所有行两两组合,哪怕这些行根本没有关联(比如把《寄生虫》的信息和浪漫类型、Netflix的标记强行匹配),这就是冗余无关数据出现的根源。
虽然你用子查询过滤了Netflix上的电影ID,但因为没有连接主表的条件,数据库还是会把这些ID和其他表的所有行乱匹配,自然就出现了不该有的结果。
修正后的视图创建代码
咱们用显式JOIN语句来关联三个表,确保只有mov_id匹配的行才会被组合,同时精准过滤条件:
CREATE VIEW DB2020_romance_on_netflix AS SELECT mi.MOVIE_ID, mi.title, mi.plot, g.genre, n.on_netflix FROM DB2020_MOVIEINFO mi INNER JOIN DB2020_genre g ON mi.MOVIE_ID = g.mov_id -- 关联电影信息表和类型表 INNER JOIN DB2020_ON_NETFLIX n ON g.mov_id = n.mov_id -- 关联类型表和Netflix表 WHERE g.genre = 'romance' AND n.on_netflix = 'yes';
代码说明:
- 用表别名(
mi、g、n)让代码更简洁易读 INNER JOIN确保只有三个表中mov_id完全匹配的行才会被选中,彻底避免了笛卡尔积- WHERE子句精准筛选「浪漫类型」且「在Netflix上线」的电影
- 不需要
DISTINCT了——因为你的表结构有主键约束,正确的连接不会产生重复行
执行这个视图后,你只会得到符合要求的两部电影:《Before Sunset》和《Before Sunrise》,不会再出现无关内容啦。
内容的提问来源于stack exchange,提问作者hollyjolly
相关产品推荐
相关产品推荐

