【问题标题】:Access SQL union query访问 SQL 联合查询
【发布时间】:2013-06-07 20:02:05
【问题描述】:

我正在使用 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

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

提前致谢!!

【问题讨论】:

    标签: sql ms-access-2007 union exists not-exists


    【解决方案1】:

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

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

    它使用 Vadim 的 implementation of 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
    

    【讨论】:

    • 成功了!我花了一段时间来改变它以适用于我自己的情况,但它似乎完全按照我的希望工作。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2017-11-02
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多