1

我正在使用 Access 2007 并且对此比较陌生,所以请耐心等待。

情况

我创建了一个简化的示例来分享。

我的数据库中有一组经常更改的表。有时有十几个表,有时只有 4 或 5 个。所有表共享一组重要信息,我想将这些数据收集到一个新表中。

示例:假设我们有以下表格和字段:

 Table1 : Name, PhoneNumber, PostalCode,...
 Table2 : Name, Phone, PostalCode, Address,...
 Table3 : Name, PhoneNo, Address, DateOfBirth,...
 Table4 : Name, PhoneNumber, Favorite Food, ...
 Etc....

我已经编写了一个查询,以将重要信息(在本例中为:姓名和电话号码)纳入一种“主列表”:

 SELECT Name, PhoneNumber 
 FROM Table1
 UNION
 SELECT Name, Phone AS PhoneNumber
 FROM Table2
 UNION 
 SELECT Name, PhoneNo AS PhoneNumber
 FROM Table3
 UNION
 etc...
 ;

问题

我正在尝试找到一种方法来编译相同的“主列表”,即使某些表不在数据库中。假设我们只有 Table1 和 Table3。无论如何,只有当它存在时才将表添加到联合查询中?和我在 SQL 方面一样糟糕,我在 VBA 方面更差。不知何故,我怀疑那里有可能,但我想我会问。

基本上,我正在尝试将其转换为 SQL:

 SELECT Name, PhoneNumber 
 FROM Table1 (IF IT EXISTS)
 UNION
 SELECT Name, Phone AS PhoneNumber
 FROM Table2 (IF IT EXISTS)
 UNION 
 SELECT Name, PhoneNo AS PhoneNumber
 FROM Table3 (IF IT EXISTS)
 UNION
 etc...
 ;

我收到一条错误消息,提示 Access 找不到输入表。我发现我可以使用以下代码来确定表是否存在:

 SELECT Count(*) AS Exists, "Table1" From MsysObjects
 WHERE type=1

解决方案有没有可能涉及这个?

提前致谢!!

4

1 回答 1

1

参数化表名或基于表存在有条件地从表中选择在我知道的 sql 级别的数据库中不起作用。相反,您必须动态创建 SQL。

下面是一个创建二维数组的示例,其中包含一个表名列表及其电话号码列名。动态构建 sql 字符串并将查询定义设置为该 sql 字符串。大概您会在启动时或在需要时调用它。

它使用 Vadim 的Contains 实现,但您可以改为查询 MsysObjects。它还需要一个现有的MasterList查询定义。

Sub Test()

    Dim tableNames(3, 2) As String
    tableNames(0, 0) = "Table1"
    tableNames(0, 1) = "PhoneNumber"

    tableNames(1, 0) = "Table2"
    tableNames(1, 1) = "Phone"

    tableNames(2, 0) = "Table3"
    tableNames(2, 1) = "PhoneNo"

    Dim i As Integer
    Dim sql As String


    For i = 0 To UBound(tableNames, 1)

         If Contains(CurrentDb.TableDefs, tableNames(i, 0)) Then

            sql = sql + " SELECT Name, " & tableNames(i, 1) & " as PhoneNumber "
            sql = sql + " FROM Table1 " & tableNames(i, 0)
            sql = sql + "  UNION"
         End If
    Next

    If Len(sql) >= Len(" UNION") Then
        sql = Left(sql, Len(sql) - Len(" UNION"))
    Else
        sql = ""
    End If

    If sql <> "" Then
        CurrentDb.QueryDefs("MasterList").sql = sql
    End If


End Sub

Public Function Contains(col As Variant, key As Variant) As Boolean
Dim obj As Variant
On Error GoTo err
    Contains = True
    obj = col(key)
    Exit Function
err:

    Contains = False
End Function
于 2013-06-11T22:52:45.710 回答