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


Part 1:题目

  1. 获取张三李四的数学成绩
  2. 已知条件:数据库中有两个表(学生信息表成绩表),如下图
  3. 逻辑过程:从学生信息表中获取张三/李四的学号,从成绩表中以学号查询满足条件的数学成绩

学生信息表
图片

成绩表
图片

Part 2:代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 = NothingEnd Sub

代码截图
图片

执行结果
图片

Part 3:部分代码解读

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

  2. 中文释义

    • 两层***Select***,内层获取张三/李四的学号,外层以学号检索需要的信息
    • 输出排序:第一级排序以学号升序(asc),第二级排序以年级降序(desc

核心SQL
图片

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