2016-09-27 36 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。