SQL子查询可以分为相关子查询和非相关子查询两类
表格数据如下
score 表
student 表
非相关子查询不依赖于外部查询条件 换句话说非相关子查询可以从母查询中独立出来且可以单独运行。
例:
SELECT * FROM dbo.Student
WHERE SID IN (SELECT SID FROM dbo.SC WHERE score>70)
SId Sname Sage Ssex
01 赵雷 1990-01-01 00:00:00.000 男
02 钱电 1990-12-21 00:00:00.000 男
03 孙风 1990-12-20 00:00:00.000 男
05 周梅 1991-12-01 00:00:00.000 女
07 郑竹 1989-01-01 00:00:00.000 女
将非相关子查询从母查询中取出后
SELECT SID FROM dbo.SC WHERE score>70
SID
02
03
03
03
05
05
07
07
可以独立运行
相关子查询 相关子查询依赖于外部于外部查询条件,需要母查询中的查询条件来进行查询 无法独立出来单独运行
查询每个同学小于自己最高分的成绩
例:SELECT *FROM dbo.Score AS A
WHERE Degree<(SELECT MAX(Degree) FROM dbo.Score AS B WHERE A.Sno=B.Sno)
Sno Cno Degree
103 3-245 86
103 6-166 85
105 6-166 79
105 3-245 75
109 3-245 68
109 3-105 76
将相关子查询独立出来进行查询
SELECT MAX(Degree) FROM dbo.Score AS B WHERE A.Sno=B.Sno
报错无法绑定由多个部分组成的标识符 "A.Sno"
由此我们可知相关子查询是需要母查询给予相对应的查询条件才可以运行
拆解此相关子查询
SELECT *FROM dbo.Score AS A
WHERE Degree<(SELECT MAX(Degree) FROM dbo.Score AS B WHERE A.Sno=B.Sno)
=
where a.Degree<(select MAX(degree) from Score b where b.Sno=a.Sno)
where a.Degree<(select MAX(degree) from Score b where b.Sno=103)
and a. Sno=103
where a.Degree<(select MAX(degree) from Score b where b.Sno=105)
and a. Sno=105
where a.Degree<(select MAX(degree) from Score b where b.Sno=109)
and a. Sno=109