簡體   English   中英

訪問SQL聯合查詢

[英]Access SQL union query

我正在使用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級別的數據庫中,無法對表名進行參數化或基於表的存在條件有條件地從表中進行選擇。 相反,您必須動態創建SQL。

下面是一個創建二維數組的示例,該數組包含一個表名列表及其電話號碼列名。 動態生成一個sql字符串,並將查詢定義設置為該sql字符串。 大概在啟動時或其他需要時調用它。

它使用Vadim的Contains實現,但是您可以查詢MsysObjects。 它還需要現有的MasterList查詢def。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM