ExcelVBA+ADO+SQLUNION 多表数据合并你挑着担,我牵着马 迎来⽇出,送⾛晚霞………… 1.
SQL的UNION运算符可以合并两个或多个的SELECT结果集,因此,我们通常使⽤该运算符来合并多表数据。
例如,在⼀个⼯作簿中存在两个表,⼀个表名为 '⼀班',另⼀个表名为'⼆班',现在我们需要将两个表的数据合并成⼀张表。
SQL语句如下:
SELECT * FROM [⼀班$] U N I O N S E L E CT * F R O M [⼆班$]结果如下:
需要说明的是,UNION运算符会对结果集去重复,只保留唯⼀值;前⾯讲去重复的时候提过,SQL去重复的过程,是先对记录排序,后再去重复,因此U U N I O N 的运算结果通常是默认升序排列的不重复记录。
例如,汇总⼀班和⼆班两个班级的学⽣名单:
SELECT 姓名 FROM [⼀班$] U N I O N S E L E CT 姓名 F R O M [⼆班$]结果如下:敢问路在何⽅
蒋⼤为 - 蒋⼤为珍藏版
看见星光
由于使⽤了UNION运算符,⼀、⼆班都存在的‘看见星光‘,只保留了⼀个。
如果不需要去重复的操作,可以使⽤关键字AL L,也就是U N I O N AL L。
同样汇总⼀班和⼆班两个班级的学⽣名单:
SELECT 姓名 FROM [⼀班$] U N I O N AL L S E L E CT姓名F R O M[⼆班$]结果如下:
由于使⽤了ALL关键字,⼀、⼆班都存在的‘看见星光‘,都被保留了下来;⽽且姓名的排放顺序是和出现的顺序⼀致的,并没有进⾏排序处理。
plsql常用快捷键
2.
不管是U N I O N还是U N I O N AL L,都要求S E L E CT语句拥有相同的列数,⽽且列的顺序必须相同。
当列数不相同时,例如以下语句:驽马十驾的读音
姓名,语⽂F R O M[⼀班$]U N I O N AL L S E L E CT姓名F R O M SELECT 姓
[⼆班$]
会得到错误提⽰:mysql语句的执行顺序
⽽当列的个数相同,但顺序不相同时,例如以下语句:
SELECT 姓
语⽂,姓姓名,语⽂F R O M[⼀班$]U N I O N AL L S E L E CT 语
名F R O M[⼆班$]
会得出错误的结果。
之所以语句能够运算,但结果不尽⼈意,⽐如姓名列出现了语⽂的成绩,是因为
列的排放顺序处理数据的。
UNION运算符总是按第⼀个SELECT语句中列
第⼀个SELECT指定了'姓名'第1列、'语⽂'第2列,则默认以后的SELECT语句第1列均为'姓名',第2列均为'语⽂'。
此外,UNION运算符总是将第⼀个SELECT语句提供的字段名称作为最终查询结果的字段名称。
例如,以下语句只是在第⼀个SELECT⼦句中使⽤了别名,但查询结果中的字段名依然是按照指定别名呈现的。
SELECT 姓名,语
语⽂AS语⽂成绩F R O M[⼀班$]U N I O N AL L S E L E CT姓名,语⽂F R O M[⼆班$]
3.
在实际汇总多表数据的过程中,难免会碰到表格列数不⼀致的情况。
姓名、语⽂、数学和英语构成,⽽例如,以下两个表,名字为‘⼀班‘的表字段由姓
另外⼀个名为’⼆班‘的表字段只有姓名、语⽂和英语,并没有数学字段。如果此时我们进⾏两表数据汇总,应该怎么处理呢?
对于缺少的字段可以使⽤某个值代替。
通常是使⽤NULL代替,语句如下:
SELECT 姓名,语⽂,数学,英语 FROM [⼀班$] UNION ALL SELECT 姓名,语
⽂,N N U L L,英语F R O M[⼆班$]
结果如下:
当然,也可以使⽤其它值代替,例如‘未考‘,语句如下:
SELECT 姓名,语⽂,数学,英语 FROM [⼀班$] UNION ALL SELECT 姓名,语⽂,''未考',英语F R O M[⼆班$]
结果如下:
4.
列数统⼀,但个数过多时,⼿⼯输⼊S Q L语句未免不够灵活⽅当需要汇总的表格列
便,此时最好是使⽤V B A的⽅式。
以本⽂的第1图为例:
Sub Sql_UNION()
文档软件有哪些Dim cnn As Object, rst As Object
Dim Mypath As String, Str_cnn As String
Dim Sql As String, Sql1 As String
Dim Sht As Worksheet, Sht_name As String
Dim i As Long
Set cnn = CreateObject("tion")
Mypath = ThisWorkbook.FullName
If Application.Version < 12 Then
Str_cnn = "Provider=Microsoft.jet.OLEDB.4.0;Extended
Properties=Excel 8.0;Data Source=" & Mypath
Else
Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & Mypath
End If
cnn.Open Str_cnn
递归函数的基例不再进行递归S S q l1="S E L E CT姓名,语⽂,数学,英语,"
F or E a c h S ht I n W or k s he e t s
S ht_na m e=S ht.N a m e
I f S ht_na m e<>Ac t i v e S he e t.N a m e T he n
S q l=S q l&S q l1&"'" &S ht_na m e&"'AS班级F R O M[" &S ht_na m e&"$]U N I O N AL L"
E nd I f
N e x t
S q l=L e ft(S q l,L e n(S q l) - 11)
Set rst = cnn.Execute(Sql)
Cells.ClearContents
For i = 0 To rst.Fields.Count - 1
Cells(1, i + 1) = rst.Fields(i).Name
Next
Range("a2").CopyFromRecordset rst二叉树的遍历方式中
cnn.Close
Set cnn = Nothing
End Sub
运算结果如下:
代码中,变量SQL1指定了需要汇总的字段名称和顺序;之后通过对⼯作表对象的遍历,合并多个select语句,并将⼯作表名称作为⼀个字段补充到SELECT⼦句中,最后使⽤ADO执⾏SQL语⾔获得查询结果。
【阅读原⽂】可以下载⽰例⽂件。
点击【
⽽当需要汇总的表格标题名称统⼀,但列数并不统⼀,表格个数⼜过多时,可以借助字典先对列标题和排列顺序做⼀个过滤储存,然后再编写和执⾏SQL语句……刹车刹车,没油了,这个问题我们以后再谈,握⽖致安,下期再见。
⼩贴⼠:
您可能见过这样的多表合并SQL语句,使⽤通配符*,代替字段名的描述:SELECT * FROM [⼀班$] UNION ALL SELECT * FROM [⼆班$] 。但作为模板应⽤,我们通常并不推荐使⽤这种⽅式,⾄于缘故,我们在Excel VBA+ADO+SQL⼊门教程009:聚合函数的⼩贴⼠⾥做了说明,此处就不再重复了。
图⽂作者:看见星光
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论