通用Excel系统中“内连接”、“左连接”和“全连接”的概念

在通用Excel选择数据源的时候,会发现有三个选项:“内连接(默认)”、“左连接”、“全连接”,这里就解释一下这三个选项之间的区别:

1、内连接(INNER JOIN)

典型的联接运算,使用像 = 或 <> 之类的比较运算符,包括相等联接自然联接

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

2、左连接(LEFT JOIN或LEFT OUTER JOIN)

左连接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

继续阅读“通用Excel系统中“内连接”、“左连接”和“全连接”的概念”

封装ADODB数据库查询的Excel VBA类模块

关于Excel操纵数据库可以参考前面文章:如何利用Excel的数据源功能实现多表合并和 SQL 查询以及如何动态修改Excel数据源的数据来源和数据源的查询语句。这里再放出一个我平常使用的封装ADODB数据库查询的Excel VBA类模块。

在使用之前,先需要声明一个类实例:

Dim db as New Database
继续阅读“封装ADODB数据库查询的Excel VBA类模块”

动态修改Excel数据表的数据来源

Excel 有一个很有用的功能是直接导入外部数据库或者使用外部数据源建立数据透视表和数据透视图。但比较可惜的是,这个数据源的查询语句是静态的,它无法根据日期自动修改(比如在应用中,我们希望每天获取的外部数据都是当天最新的数据),下面两个函数是修改外部数据源的 VBA 代码,调用它们就可以建立动态的数据源。

' 更改数据表的来源
' wb:工作表对象
' connectionName:数据来源连接名称
' strSQL:新查询语句(修改SQL的查询代码)
' strSQLConnection:新连接语句(修改来源数据库,在对DBF数据库操作时非常有用)
' author: zhang@zhiqiang.org, 2010
Public Sub ChangeODBCConnection(wb As Excel.Workbook, connectionName As String, _
        Optional strSQL As String = "", Optional strSQLConnection As String = "")

    With wb.Connections(connectionName).ODBCConnection
        If Len(strSQLConnection) Then .CommandText = SplitString(strSQLConnection)
        If Len(strSQL) Then .Connection = SplitString(strSQL)
    End With
    wb.Connections(connectionName).Refresh
End Sub

' 更改数据表的来源
' pc:数据透视表的PivotCache对象 (例如:ActiveSheet.PivotTables(1).PivotCache)
' connectionName:数据来源连接名称
' strSQL:新查询语句(修改SQL的查询代码)
' strSQLConnection:新连接语句(修改来源数据库,在对DBF数据库操作时非常有用)
' author: zhang@zhiqiang.org, 2010
Public Sub ChangePivotConnection(pc As Excel.PivotCache, Optional strSQLConnect, _
        Optional strSQL As String = "")
    Dim blnODBCConnect As Boolean

    With pc
        If .QueryType = xlODBCQuery Then
            blnODBCConnect = True
            If Len(strSQLConnect) = 0 Then strSQLConnect = .Connection
            strSQLConnect = Replace(strSQLConnect, "ODBC;DSN", "OLEDB;DSN", 1, 1, vbTextCompare)
        End If

        If StrComp(.Connection, strSQLConnect, vbTextCompare) <> 0 And Len(strSQLConnect) Then
            .Connection = strSQLConnect
        End If

        If StrComp(.CommandText, strSQL, vbTextCompare) <> 0 And Len(strSQL) Then
            .CommandText = (strSQL)
        End If

        If blnODBCConnect = True Then
            .Connection = Replace(.Connection, "OLEDB;DSN", "ODBC;DSN", 1, 1, vbTextCompare)
        End If

        .Refresh
    End With
End Sub

' 将字符串分割成短字符串的数组
Private Function SplitString(ByVal s As String) As Variant
    Dim ss() As Variant
    Dim i As Long

    ReDim ss(0 To Len(s) \ 200) ' note: it is not 256
    For i = 0 To UBound(ss)
        ss(i) = Array(Mid(s, i * 200 + 1, 200))
    Next i

    SplitString = ss
End Function

原文:https://zhiqiang.org/coding/change-pivotcache-source.html

SQL引用数据表来源的方法

  • 通过名称引用。比如定义一个数据区域名为"Industry",那么SQL语句可以写成select * from industry。这种方法最多支持 65535 行数据,当数据行数过多时, Excel 会提示找不到该数据表。同一张工作表里可以有多个数据表,通过定义不同的名称去引用。
  • 通过工作表名引用。比如要引用Sheet1工作表内所有数据,SQL语句为select * from `Sheet1$`。这里工作表名后面的$号表示这是一个工作表。工作表可以包含高达 100 万行数据,但同一个工作表内只能有一个数据表。
  • 通过数据表的地址进行引用。比如select * from `Quotes$A1:F10000`
  • 路径.文件引用。如果数据表不在目前工作的文件内,需要在上面的数据表名前添加数据文件的路径和文件名,比如select * from `D:\test.xlsx`.`Quotes$`
  • 上面的``符号可以用半角中括号[]代替。

SQL Server 客户端连接的问题

经常遇到 SQL Server 客户端无法连接到SQL Server 实例(服务)。现在将这类问题归纳如下:

一、SQL Server 实例(服务)的问题

1、实例(服务)未启动

打开“SQL Server 配置管理器”(或者“管理工具”中的“服务”),检查对应的实例(服务)的状态是否为“正在运行”(或者“已启动”)。如果该实例没有启动(甚至客户端在连接时使用了错误的主机名和实例名),这个时候客户端当然连接不到SQL Server数据库了。

继续阅读“SQL Server 客户端连接的问题”