显示多个表的结果

时间:2016-09-27 21:57:30

标签: sql ms-access

我正在开发一个传统的Access CRM,为此,我的任务是添加一些额外的功能,直到我们切换到合适的解决方案。

我有一系列表格,表示案例与各种类型的案例说明之间的一对多连接。这些案例说明都代表了特定于给定工作流程的各种类型的信息(即,进入我们数据库的电子邮件需要具有特定字段,这些字段与调用不同),因此每种不同类型的案例注释由不同的表格表示。所以我的表看起来像

    • ID
    • 标题
    • 等...
  • Case_Emails
    • ID
    • 案例ID
    • 发送电子邮件
    • 来自电子邮件
    • 等...
  • Case_Calls
    • ID
    • 案例ID
    • 来电者邮件
    • 等...

案例备注之间存在一些共享字段,例如电子邮件。一个理想的功能是将一个电子邮件地址列表过滤到一个ComboBox中,基于之前与案例相关的注释以及默认值(我们日常操作中常用的电子邮件地址)。

目前,我正在使用VBA在每个表上打开查询,然后迭代RecordSet捕获唯一值。但是,如果可能的话,我想从同一个查询中提取这些内容。

我一直在阅读各种类型的JOIN,我不相信他们会做我需要的。

我可以组合来自不同表格的某些字段来创建唯一值列表吗?

2 个答案:

答案 0 :(得分: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 :(得分:0)

  

如果可能的话,我想从同一个查询中提取这些内容。

在ANSI-92查询模式下使用SQL DLL(或使用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;

然后,您可以使用您选择的技术在传递参数值时执行此过程。