打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQL Select之Union及全连接 | VBA实例教程

除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www.zhanzhanrufeng.com/cat4/422.html,VBA交流群273624828。

在上节“SQL Select 之左连接、右连接、内连接”中我们提到过SQL中还有一种全连接的形式,但是在VBA中并不支持这种连接形式,我们这节来看一个Union方法,利用该方法可以间接的实现全连接的功能。

先来看下Union的用法。Union是用来连接两个Select的结果集,这两个结果集要求有相同的列数、相同的字段名、相同的数据类型、相同的顺序,符合这样条件的两个结果集才能被连接起来,union是去重复的,如果不想去重复的话可以用"union all",这样相同的数据会保留。

下面看一个例子,我数据库中有两个表“一班”和“二班”,每个表中都有学号、姓名、电话、住址列,符合上面所要求的条件所以我可以直接用Union,看代码

Sub union示例()
Dim cnn As Object, rs As Object, SQL$, mypath, i
Cells.Clear
Set cnn = CreateObject("adodb.connection")
mypath = ThisWorkbook.Path & "\学校管理.accdb"
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & mypath
SQL = "select * from 一班 union (select * from 二班)"
'SQL="select * from 一班 union all (select * from 二班)"   '允许重复
Set rs = cnn.Execute(SQL)
For i = 0 To rs.fields.Count - 1
Cells(1, i + 1) = rs.fields(i).Name
Next
Range("a2").CopyFromRecordset rs
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

"select * from 一班 union (select * from 二班)"这句中两个结果集分别是"select * from 一班"和"select * from 二班",用union直接连接用"结果集一 union 结果集二"即可。

知道了union的用法下面我们再回到之前地址表和电话表的例子,现在我们要将两个表的人全都列出来,有住址的写上住址、有电话的写上电话,没有的就空着,也就相当于是全连接的形式了。看下这个问题的解题思路:

(表1 left join 表2)union (表2 left join 表1)

分析下上面的思路,我们讲过左连接则左边表的数据全保留,那表1 left join 表2则表1中的内容全都有了,表2 left join 表1则表2中的内容全都有了,再运行个union,连接起来去个重复,最后结果就是我们要的数据了。看代码:

Sub 全连接()
Dim cnn As Object, rs As Object, SQL$, mypath, i, SQL1, SQL2
Cells.Clear
Set cnn = CreateObject("adodb.connection")
mypath = ThisWorkbook.Path & "\学校管理.accdb"
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & mypath
SQL1 = "select a.姓名,a.住址,b.电话 from 住址表 as a left join 电话表 as b on a.姓名=b.姓名"
SQL2 = "select a.姓名,b.住址,a.电话 from 电话表 as  a left join 住址表 as b on a.姓名=b.姓名"
SQL = SQL1 & " union " & SQL2
Set rs = cnn.Execute(SQL)
For i = 0 To rs.fields.Count - 1
Cells(1, i + 1) = rs.fields(i).Name
Next
Range("a2").CopyFromRecordset rs
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

"select a.姓名,a.住址,b.电话 from 住址表 as a left join 电话表 as b on a.姓名=b.姓名"将住址表当左表,姓名、住址从左表中选,电话从右表中选,最后结果是一个包含住址表所有人姓名、住址、有电话人的电话的结果集, "select a.姓名,b.住址,a.电话 from 电话表 as  a left join 住址表 as b on a.姓名=b.姓名"将电话表当作左表,注意下选择顺序仍然是姓名、住址、电话,只不过住址是从右表住址表中选择的,这样是为了保证两个结果集的列的顺序是一致的。

本节示例文件下载地址:http://pan.baidu.com/s/1dDs2fvV

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
sql select语句的基本知识
数据透视表的高级应用
Excel SQL方法合并多个工作表数据,透视表统计各种数据
Excel VBA ADO SQL入门教程012:多表数据合并汇总
sql server2000 行转列(2)
不用函数,不用编程,快速将多个工作表数据合并到一个工作表中!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服