日期:2014-05-17 浏览次数:20867 次
--> 测试数据: [SC_33]
if object_id('[SC_33]') is not null drop table [SC_33]
create table [SC_33] (课程号 int,学号 int)
insert into [SC_33]
select 1,1 union all
select 1,2 union all
select 1,3 union all
select 1,4
--> 测试数据: [STUDENT_33]
if object_id('[STUDENT_33]') is not null drop table [STUDENT_33]
create table [STUDENT_33] (学号 int,所在系 varchar(4))
insert into [STUDENT_33]
select 1,'数学' union all
select 2,'语文' union all
select 3,'数学' union all
select 4,'英语'
update SC_33 set 课程号 = 3
where (select 所在系 from STUDENT_33 st WHERE st.学号 = SC_33.学号)='数学'
select * from [SC_33]
/*
课程号 学号
----------- -----------
3 1
1 2
3 3
1 4
*/
update SC_33 set 课程号 = 3
from SC_33 t join STUDENT_33 st on st.学号 = t.学号 where st.所在系='数学'
select * from [SC_33]
/*
课程号 学号
----------- -----------
3 1
1 2
3 3
1 4
*/
------解决方案--------------------
第一条其实是有两表关联的,第二条是对筛选结果集,不进行关联(没有在update中关联而已)。如果你第二条的所在系多于一个,就会报错,如果非要这样写,你要用in而不是=
------解决方案--------------------
--1
update SC_33 set 课程号 = 3 where ('数学' = (select 所在系 from STUDENT_33 st WHERE st.学号 = SC_33.学号))
--2
update SC_33 set 课程号 = 3 where (学号 in (select st.学号 from STUDENT_33 st join SC_33 sc on (st.学号 = sc.学号) and st.所在系='数学'))
第一个是相关子查询,也可以说成是嵌套子查询
第二个是不相关子查询,后面的join 查询自成一体
可以和前面的表没有任何关系
当然有关系的时候,比如你这种情况,第一种写法更简洁易读。
------解决方案--------------------
楼上的几位解释的很清楚了。
两个查询区别主要在于where条件中的写法
--第一种
update SC_33 set 课程号 = 3 where('数学' = (select 所在系 from STUDENT_33 st WHERE st.学号 = SC_33.学号))
--这个where中子查询结果是根据学号与前面update一一对应关联的
--第二条
update SC_33 set 课程号 = 3 where ('数学' = (select 所在系 from STUDENT_33 st join SC_33 sc on st.学号 = sc.学号))
--这个where中的关联查询
select 所在系 from STUDENT_33 st join SC_33 sc on st.学号 = sc.学号
--是独立的一个结果集与外层的update更新没有一一对应关系,所以报错
--单独执行了子查询
select 所在系 from STUDENT_33 st WHERE st.学号 = SC_33.学号
--SC_33.学号 这个前缀名没有指定表,也就sql不清楚SC_33.学号来自哪个表当然报错