亲爱的潘玮柏 - 零零七
系统: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
中文释义:
核心SQL
思考:输出的信息中不含有姓名信息,看起来不清晰,那么如何将姓名信息加进来呢?和之前的left join结合吗?