2016-09-27 63 views
1

我正在開發一個傳統的Access CRM,爲此我負責添加一些額外的功能以支持我們,直到我們切換到適當的解決方案。顯示來自多個表格的結果

我有一系列的表格表示一個案例和各種類型的案例筆記之間的一對多連接。這些案例筆記都代表特定於給定工作流程的各種類型的信息(即進入我們數據庫的電子郵件需要具有特定字段,這與調用不同),因此每種不同類型的案例筆記都由不同的表格。所以,我的表看起來像

  • 案件
    • ID
    • 標題
    • 等...
  • Case_Emails
    • ID
    • 案例ID
    • 到電子郵件
    • 從電子郵件
    • 等...
  • Case_Calls
    • ID
    • 案例ID
    • 來電電子郵件
    • 等...

其中在諸如電子郵件之類的個案註釋之間存在一些共享字段。一個需要的功能是根據與案例相關的先前筆記以及默認值(在我們的日常操作中常用的電子郵件地址),將電子郵件地址列表過濾到ComboBox中。

目前,我正在使用VBA打開每個表的查詢,然後遍歷RecordSet捕獲唯一值。但是,如果可能的話,我想從相同的查詢中提取這些內容。

我一直在閱讀各種類型的JOIN,我不相信他們做我需要的東西。

我可以組合不同表中的某些字段來創建唯一值列表嗎?

+0

這不是您可以輕鬆使用Access或SQL執行的操作。這對我來說看起來像是一個EAV結構,我假定表「Cases」與來自表「Case_Emails」或「Case_Calls」中的至少一條記錄相匹配。如果這是真的,最簡單的解決方法是將「To Email」和「Caller Email」移動到名爲「Email」的「Cases」表中。 「從電子郵件」應該可以保持。一旦表格規範化後,應該很容易找到唯一的電子郵件地址。雖然我不會循環記錄集。使用SQL。 'SELECT DISTINCT Cases。[Email] FROM Cases;' – MoondogsMaDawg

+0

看看UNION – Rene

+0

@ChristopherD .:它看起來不像EAV。僅僅因爲兩個實體具有共同的屬性並不一定意味着該屬性應該被提取到共享實體中(例如名稱,價格,數量等)。 – onedaywhen

回答

1

如果您剛剛在至少一個表格中發生過至少一次的電子郵件列表之後,那麼這應該是有用的。

SELECT t1.emailAdd from 
(
select emailField as emailAdd from Case_Emails 
union 
select emailField as emailAdd from Case_Calls 
) t1 
group by t1.emailAdd 
order by t1.emailAdd 

如果必須只在表中的至少一個發生至少一次,並且必須鏈接到一個特定的情況下,電子郵件(例如12345),那麼這應該這樣做:

SELECT t1.emailAdd from 
    (
    select emailField as emailAdd from Case_Emails where CaseID=12345 
    union 
    select emailField as emailAdd from Case_Calls where CaseID=12345 
    ) t1 
    group by t1.emailAdd 
    order by t1.emailAdd 
+1

爲什麼'分組'?我沒有看到它在做什麼。 – onedaywhen

+0

'union' *正是*我錯過了,謝謝! – Thebluefish

+0

@onedaywhen'group by'只是簡單地顯示每個地址一次。您也可以使用'DISTINCT' – JCro

0

如果可能,我想從相同的查詢中提取這些數據。

使用SQL DLL而ANSI-92查詢模式(或做同樣的手動使用Access GUI工具):

CREATE VIEW CaseEmailAddresses (case_id, email_address) 
AS 
SELECT [Case ID], [To Email] FROM Case_Emails 
UNION 
SELECT [Case ID], [Caller Email] FROM Case_Calls; 
在SQL DML

然後(查詢):

SELECT email_address 
    FROM CaseEmailAddresses 
WHERE case_id = <inject id here>; 

或者當您處於ANSI-92查詢模式時,您可以創建一個存儲過程,例如假設case_id爲整數類型:

CREATE PROCEDURE GetEmailAddresses (:case_id INT) 
AS 
SELECT case_id, email_address 
    FROM CaseEmailAddresses 
WHERE case_id = :case_id; 

然後你可以使用你選擇的技術,同時傳遞參數值時,執行此PROC。