基于两张表对比编写SQL:筛选恐怖片导演创建结构一致的新表
实现方案
方案1:创建表并同步插入数据(兼容绝大多数数据库)
直接通过查询结果生成目标表,不需要提前建表:
CREATE TABLE HorrorDirector AS SELECT DISTINCT d.Id, d.Name FROM Director d INNER JOIN Movie m ON d.Name = m.DirectorName WHERE m.Genre = 'Horror';
说明:
DISTINCT用于过滤重复记录,避免同一个导演拍摄多部恐怖片时出现重复条目。如果你的数据库不支持CREATE TABLE AS语法(比如老版本SQL Server),可以改用SELECT INTO写法:SELECT DISTINCT d.Id, d.Name INTO HorrorDirector FROM Director d INNER JOIN Movie m ON d.Name = m.DirectorName WHERE m.Genre = 'Horror';
方案2:先建表再插入数据(可控性更高)
如果需要严格对齐Director表的字段属性、索引等配置,可以先创建空表再插入符合条件的数据:
第一步:创建空的HorrorDirector表
-- 通用标准SQL写法 CREATE TABLE HorrorDirector ( Id int, Name varchar(255) ); -- 快捷复制表结构写法(不同数据库略有差异) -- MySQL/PostgreSQL:CREATE TABLE HorrorDirector LIKE Director; -- SQL Server:SELECT * INTO HorrorDirector FROM Director WHERE 1=0;
第二步:插入符合要求的导演数据
推荐使用EXISTS写法,性能优于JOIN写法,大数据量下效率更高:
INSERT INTO HorrorDirector (Id, Name) SELECT DISTINCT d.Id, d.Name FROM Director d WHERE EXISTS ( SELECT 1 FROM Movie m WHERE m.DirectorName = d.Name AND m.Genre = 'Horror' );
注意事项
- 如果你的Movie表中恐怖片的Genre存储值为中文
恐怖,需要把过滤条件里的'Horror'替换为实际存储的值 - 关联条件依赖Director.Name和Movie.DirectorName完全匹配,如果存在同名不同人的情况,需要调整关联逻辑(比如增加DirectorId关联字段)
内容的提问来源于stack exchange,提问作者MrEmper
相关产品推荐
相关产品推荐

