大家好,我们今天接着讲左外连接,今日讲左外连接在数据表中的应用。对于数据而言,有的放在EXCEL文件中,我们称之为工作表;有的放在数据库中,我们称之为数据表。两者都是数据的存储方式,这也是我在本书中着重讲解的两种数据连接的原因。并不是说数据库就一定是什么数据存储的高级设备,我们工作中最常接触的EXCEL也可以作为数据库来对应的,对于左外连接而言,我在上讲详细的介绍了和EXCEL工作表连接的应用,今日我将讲解这种连接和数据表连接的应用。
实例,我们还是用第57讲内容的数据表数据,在mydata2中的数据如下:
![3c54216adba5d61b7e9ff318626aaa4f.png](https://i-blog.csdnimg.cn/blog_migrate/f2e69b9af143db15a8bd7ffd7c664fef.jpeg)
在mydata中的数据如下:
![5de74b1a929764baf19a2a1d26517684.png](https://i-blog.csdnimg.cn/blog_migrate/235e7bd120e914a0d2c1a910f8f2c7d3.jpeg)
我们要知道在数据库mydata2中的所有员工分红情况,这个时候就可以用左外连接了。下面看我给出的代码:
Sub mynzRecords_59() '第59讲 左外连接应用于两个数据表的讲解
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Worksheets("59").Select
Cells.ClearContents
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "mydata2.accdb"
strTable = "员工信息"
cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath
strSQL = "SELECT a.员工编号,a.姓名,a.性别,b.金额 FROM " _
& "员工信息 AS a LEFT JOIN [MS Access;Pwd=;Database=" & ThisWorkbook.Path _
& "mydata.accdb;].员工分红 AS b ON a.员工编号 = b.员工编号"
rsADO.Open strSQL, cnADO, 1, 3
For i = 1 To rsADO.Fields.Count
Cells(1, i) = rsADO.Fields(i - 1).Name
Next
Range("a2").CopyFromRecordset rsADO
ActiveSheet.Columns(rsADO.Fields.Count).NumberFormatLocal = "¥#,##0.00;¥-#,##0.00"
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代码截图:
![0e0426d093f50c32c63a6cfe54586e1c.png](https://i-blog.csdnimg.cn/blog_migrate/04f6b7894bcb9fa91ed52a9a0e195e37.jpeg)
代码解读:
1 不知大家注意到否,上述代码和内连接第57讲内容比较,我只是把上面的INNER换成了LEFT.
2 我们需要注意的是这种连接方式的SQL语句的写法:strSQL = "SELECT a.员工编号,a.姓名,a.性别,b.金额 FROM " _
& "员工信息 AS a LEFT JOIN [MS Access;Pwd=;Database=" & ThisWorkbook.Path _
& "mydata.accdb;].员工分红 AS b ON a.员工编号 = b.员工编号"
其中的连接第二个数据库的结构大家要千万注意,由于在之前的57讲中我详细的讲过了不再多说,这里只是提醒大注意:在写代码的时候尽可能不要去书写,而是复制和修正,这样会让你的代码会更容易些。
好了,下面看代码的运行:
![51c3ca1efb0b55a30ae3af30992d61db.png](https://i-blog.csdnimg.cn/blog_migrate/32b52e2756959671e8b6f06518149a61.jpeg)
今日内容回向:
1 左外连接和内连接返回的结果有什么不同?
2 左外连接连接数据表和工作表的方式有什么不同?