如何基于tableB内容从tableA创建满足筛选要求的视图
视图创建实现方案
以下实现默认两个表的课程名称字段均为course_name,如果实际字段名不同可自行替换。
1. 筛选包含tableB中存在的课程的视图
优先使用内关联实现,性能优于IN子查询,视图会自动同步tableB的最新更新内容,无需手动刷新:
CREATE VIEW v_course_included AS SELECT a.* FROM tableA a INNER JOIN tableB b ON a.course_name = b.course_name;
如果tableB存在重复的课程名称,可以加DISTINCT避免返回重复的课程记录:
CREATE VIEW v_course_included AS SELECT DISTINCT a.* FROM tableA a INNER JOIN tableB b ON a.course_name = b.course_name;
2. 筛选排除tableB中存在的课程的视图
优先使用NOT EXISTS实现,大数据量下性能优于LEFT JOIN + IS NULL的写法:
CREATE VIEW v_course_excluded AS SELECT a.* FROM tableA a WHERE NOT EXISTS ( SELECT 1 FROM tableB b WHERE b.course_name = a.course_name );
也可以根据使用习惯选择左关联写法:
CREATE VIEW v_course_excluded AS SELECT a.* FROM tableA a LEFT JOIN tableB b ON a.course_name = b.course_name WHERE b.course_name IS NULL;
注意事项
- 需确保两个表的
course_name字段的字符集、排序规则完全一致,避免隐式转换导致匹配失败或性能下降 - 普通视图本身不存储数据,每次查询时都会实时读取tableA和tableB的最新内容,完全适配tableB不定期更新的需求,无需额外维护
内容的提问来源于stack exchange,提问作者Cookie
相关产品推荐
相关产品推荐

