左连接和右连接的区别_Access/VBA/Excel之Access左连接

Part 1:目标

成绩表

55dc7511837b0f6cec43370387e24d99.png

学生信息表

125b423a641fb8f5b7631e6e08fe0d12.png

运行过程

e6940bd85706cb895519fb52955b1645.gif
  1. 获取学号为1101学生在不同年级的语文成绩,输出信息包括:姓名,学号,性别,年级,语文成绩
  2. 最终想要获得的信息来自于两个工作表,所以需要连接查询
  3. 逻辑过程
  • 连接数据库
  • 根据需求确定SQL语句
  • 执行SQL语句,得到recordset
  • recordset写入工作表(字段名+所有记录 列名+每一行)
  • 断开与数据库的连接
  1. SQL语句
  • "Select " & opFilds & " from " & "(" & tbls & ")" & " where (" & searchC & ")"
  • opFilds = "姓名," & tblNote & ".学号,性别,年级,语文成绩"
  • searchC = tblNote & ".学号=1101"
  • tbls = tblNote & " left join " & tblName & " on " & tblNote & ".学号=" & tblName & ".学号"

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" tblName = "学生信息表" tblNote = "成绩表" '连接数据库 With cnn .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "Data Source=" & dbAddr  End With opFilds = "姓名," & tblNote & ".学号,性别,年级,语文成绩" searchC = tblNote & ".学号=1101" tbls = tblNote & " left join " & tblName _ & " on " & tblNote & ".学号=" & tblName & ".学号" SQL = "Select " & opFilds & " from " & "(" & tbls & ")" & " where (" & searchC & ")" Set rs = cnn.Execute(SQL)  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

代码截图

7279d2bf3b797dc81c81852856e3d282.png
9f01015f7af5e36e80cac485ca541bb2.png

执行结果

30f264a92959453a8a85a1909abb3423.png

Part 3:部分代码解读

  1. SQL = "Select " & opFilds & " from " & "(" & tbls & ")" & " where (" & searchC & ")"
  • 本问题中,相关变量取值后SQL语句如下
  • Select 姓名,成绩表.学号,性别,年级,语文成绩 from (成绩表 left join 学生信息表 on 成绩表.学号=学生信息表.学号) where (成绩表.学号=1101)
Select 姓名,成绩表.学号,性别,年级,语文成绩 from (成绩表 left join 学生信息表 on 成绩表.学号=学生信息表.学号) where (成绩表.学号=1101)
  1. 中文解读:从成绩表和学生信息表连接表中获取学号为1101的学生信息
  2. 表1 left join 表2 on 表1.ID=表2.ID
  • 两个表进行连接,以左侧为基准,即这里的表1
  • 连接条件:表1与表2的ID号相同
  • 当表2中满足表1中ID条件的有多条记录,那么进行分别匹配
  • 当表2中没有满足表1中ID的条件时,匹配Null

例1:匹配多个,修改学生信息表,增加同样学号的

928efaab17d2d4d20e5076952f609376.png

查询结果

7304b7ade6d2340932e9b3e2873907b5.png

例2:若未匹配上,则对应信息为空

d06a58452f5c895b3909107ba2325d1b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值