从一张表选择部分字段插入到另外一张表,并且记录不重复

项目实际需求,需要找出学生属于选修的选课记录,并且将部分字段插入到另外一张表,记录不重复。

insert into CEDUCOURSETUITIONDETAIL (COURSEREGISTER,COURSE,INTOTIME)(
select t.COURSEREGISTER,t.COURSE,GETDATE() from 
(select A.COURSEREGISTER,A.COURSE from 
(select  b.COURSEREGISTER,b.COURSE,c.GRADE,c.SPECIALITY from courseregister a, courseregisteritem b,student c,SPECIALITY s
where a.id = b.courseregister
and c.id = a.student and c.SPECIALITY=s.ID and s.TEACHING_DEPT=9
) a 
left join 
(select a.course,b.GRADE,b.SPECIALITY from masterplanitem a,masterplan b,SPECIALITY s
where a.masterplan = b.id and b.SPECIALITY=s.ID and s.TEACHING_DEPT=9
) b on a.COURSE = b.COURSE and a.GRADE = b.GRADE and a.SPECIALITY=b.SPECIALITY where (b.course is null)
) t left join CEDUCOURSETUITIONDETAIL c on t.COURSE=c.COURSE and t.COURSEREGISTER=c.COURSEREGISTER where (c.course is null)
)

每个年级每个专业都有对应的唯一的教学计划,教学计划对应有多门课程,由此可知年级id、专业id、课程id的组成是唯一的,所以,先查出所有学生的选课记录,由选课记录关联查询的年级id、专业id、课程id匹配对应的由教学计划关联查询的年级id、专业id、课程id,凡是必修的课程都可以对应找到记录,否则为选修课程

重点:查出所有属于选修的选课记录,再使用left join关联要插入的这张表,通过插入的字段作为条件,再判断是否为空,对应为空的记录就是未插入的记录。

关键:left join 和 is null (灵活使用很重要)

并且on where having 子查询的嵌套,它们的执行顺序都必须考虑恰当,对速度的提升有很大重要性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值