分享

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

 yuxinrong 2019-08-20

 2017-12-16

亲爱的潘玮柏 - 零零七

系统:Windows 7
软件:Excel 2010 / Access 2010

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

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

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

  • 涉及知识:ADOSQL:Select

Part 1:题目

  1. 获取张三李四的数学成绩

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

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

学生信息表

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:部分代码解读

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

  2. 中文释义

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

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

核心SQL


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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多