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

成绩表

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:部分代码解读
**核心*SQL***:Select 学号,年级,数学成绩 from 成绩表 where (学号 in (Select 学号 from 学生信息表 where (姓名 in ('张三','李四')))) order by 学号 asc,年级 desc
中文释义:
- 两层***Select***,内层获取张三/李四的学号,外层以学号检索需要的信息
- 输出排序:第一级排序以学号升序(asc),第二级排序以年级降序(desc)
核心SQL

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