2016-10-09 115 views
0

我有3個數據表,我需要加入才能生成一個表並顯示以下字段: u.master_id,p.surname,p.forename1,c.number,u.statusSQL從3個表加入字段

下面是表的細節:

Table 1 (person p) 
Field name = entity_id (number) 
Field name = surname(text) 
Field name = forename1(text) 
Field name = auditflag 

Table 2 (users u) 
Field name = master_id (number) 
Field name = email (number) 
Field name = status (text) 
Field name = auditflag 

Table 3 (contact c) 
Field name = master_id (number) 
Field name = entity_id (number) 
Field name = number (text = holds the actual email address) 
Field name = auditflag 

從表2中的master_id場和3個鏈接到該人ENTITY_ID(master_id = p.entity_id)

電子郵件字段從表2鏈接到表3中的entity_id(u.email = c.entity_id)獲得號碼

的auditflag用於標記每個作爲有效記錄,即(p.auditflag = 1 AND u.auditflag = 1 AND c.auditflag = 1)

我使用Excel 2010中VBA - 連結到PostGreSQL數據庫來獲取數據。 下面是我用來加入兩個表的工作正常,但我的問題是,「電子郵件」只顯示一個數字,因爲實際地址是在第三個表(聯繫人)下名爲「號碼」的字段。

我不知道如何包含第三個表來顯示我的查詢中的字段c.number。

Const sqlconnection = "Provider=oledb;" 

Dim conn As New Connection 
    conn.ConnectionString = sqlconnection 
    conn.Open 

Dim rs As Recordset 

Dim prs As String 
    prs = "SELECT u.master_id, p.surname, p.forename1, u.email, u.status " _ 
    & "FROM users u INNER JOIN person p ON u.master_id=p.entity_id " _ 
    & "WHERE u.auditflag=1 AND p.auditflag=1 " _ 
    & "ORDER BY u.master_id " 

Set rs = conn.Execute(prs) 
With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1")) 
    .Refresh 
End With 

回答

0

你有所有的作品;您只需將第三個表格添加到查詢中並選擇所需的列。

Dim prs As String 
    prs = "SELECT u.master_id, p.surname, p.forename1, c.number as email, u.status " _ 
     & "FROM users u INNER JOIN person p ON u.master_id=p.entity_id " _ 
     & " INNER JOIN contact c ON c.master_id=p.entity_id and u.email=c.entity_id " _ 
     & "WHERE u.auditflag=1 AND p.auditflag=1 AND c.auditflag=1 " _ 
     & "ORDER BY u.master_id " 

書面,這個查詢只會有活動(auditflag=1person活躍contact行用戶。更改爲左連接並將auditflag檢查移至連接條件將允許返回所有三個表中沒有活動行的用戶。作爲一個方面說明,我發現表中的列名正在積極地處理,不容易理解它們的含義;如果可以的話,我會建議重新考慮你使用的名字。

+0

謝謝。這真的幫助我理解如何更好地配合。 – BradleyS