您的位置:首页 > 编程语言 > VB

Access/VBA/Excel-13-嵌套查询

2018-01-17 22:32 253 查看
微信公众号原文

系统:Windows 7

软件:Excel 2010 / Access 2010

这个系列开展一个新的篇章,重点关注Access数据库

主体框架:以Excel作为操作界面,Access作为数据库

今天讲讲嵌套查询:需要先从表1获取信息1,再以信息1去表2获取最终信息2

涉及知识:
ADO
SQL:Select


Part 1:题目

获取张三李四的数学成绩

已知条件:数据库中有两个表(学生信息表成绩表),如下图

逻辑过程:从学生信息表中获取张三/李四的学号,从成绩表中以学号查询满足条件的数学成绩

学生信息表



成绩表



Part 2:代码

Sub test()
Dim cnn As New ADODB.Connection '连接
Dim rs As New ADODB.Recordset
Dim SQL As String
Dim tblName
Dim dbAddr

dbAddr = ThisWorkbook.Path & "\学生信息.accdb"
tbl1Name = "学生信息表"
tbl2Name = "成绩表"

'连接数据库
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open "Data Source=" & dbAddr
End With

op1Filds = "学号"
search1C = "姓名 in ('张三','李四')"
SQL1 = "Select " & op1Filds & " from " & tbl1Name & " where (" & search1C & ")"

op2Filds = "学号,年级,数学成绩"
search2C = "学号 in (" & SQL1 & ")"
SQL2 = "Select " & op2Filds & " from " & tbl2Name & " where (" & search2C & ") order by 学号 asc,年级 desc"

Set rs = cnn.Execute(SQL2)

Dim sht
Dim fildNum

Set sht = ThisWorkbook.Worksheets("示例")
sht.Cells.ClearContents

fildNum = rs.Fields.Count
For j = 0 To fildNum - 1 Step 1
fildName = rs.Fields(j).Name
sht.Cells(1, j + 1) = fildName
Next j

sht.Cells(2, 1).CopyFromRecordset rs

cnn.Close
Set rs = Nothing
Set cnn = Nothing

End Sub


代码截图



执行结果



Part 3:部分代码解读

核心SQL
Select 学号,年级,数学成绩 from 成绩表 where (学号 in (Select 学号 from 学生信息表 where (姓名 in ('张三','李四')))) order by 学号 asc,年级 desc


中文释义:

两层Select,内层获取张三/李四的学号,外层以学号检索需要的信息

输出排序:第一级排序以学号升序(asc),第二级排序以年级降序(desc

核心SQL



思考:输出的信息中不含有姓名信息,看起来不清晰,那么如何将姓名信息加进来呢?和之前的left join结合吗?

本文为原创作品,如需转载,可加小编微信号
learningBin


以上为本次的学习内容,下回见

如发现有错误,欢迎留言指出

更多精彩,请关注微信公众号

扫描二维码,关注本公众号

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: