2016-11-13 79 views
0

我有如下的关系在我的数据库: relations让所有不符合项在链路表中MS-访问

有一个公司不同的培训,他们被重复像一年2-3次。

现在我想要获取tbl_employee条目与报表无关的所有tbl_events条目并将它们显示在报表中。

到目前为止,我试着做一个查询给我所有雇员与他们已经访问ev_name。

qry_visited:

SELECT tbl_employee.em_number 
    ,tbl_event.ID AS ev_visited_id 
FROM (
    tbl_event INNER JOIN tbl_date ON tbl_event.[ID] = tbl_date.[da_f_event] 
    ) 
INNER JOIN (
    tbl_employee INNER JOIN tbl_training ON tbl_employee.[ID] = tbl_training.[tr_f_employee] 
    ) ON tbl_date.[ID] = tbl_training.[tr_f_date]; 

然后我写了第二个查询: qry_unvisited

SELECT qry_visited.em_number 
    ,tbl_event.ev_name 
    ,qry_visited.ev_visited_id 
FROM qry_visited 
RIGHT JOIN tbl_event ON qry_visited.ev_visited_id = tbl_event.ID 
WHERE (((qry_visited.ev_visited_id) IS NULL)); 

这些查询只一起工作,如果我限制了第一个只有一个员工。我宁愿为所有员工使用em_number和ev_name记录集。

我还研究了几天的工作(并解决了左外部,右外部和全外部加入),但没有人做到这一点。

感谢您的帮助!

编辑1

例子: 有3名员工(EMP1,EMP2,epm3)和3个活动(EV1,EV2,EV3)

比方说

  • EMP1访问ev1和ev2
  • emp2 visited ev2 and ev3
  • emp3 visited到目前为止无

我希望我的结果是这样的:

| employee | not visited events | 
    emp1  ev3 
    emp2  ev1 
    emp3  ev1 
    emp3  ev2 
    emp3  ev3 

回答

1

这应该给你,没有相关员工的事件列表。

SELECT DISTINCTROW tbl_event.* 
FROM ((tbl_event 
LEFT JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event) 
LEFT JOIN tbl_training ON tbl_date.ID = tbl_training.tr_f_date) 
LEFT JOIN tbl_employee ON tbl_training.tr_f_employee = tbl_employee.ID 
WHERE tbl_employee.ID IS NULL 

如果我理解正确的,你要的是所有可能的员工事件的组合,其中不包括实际发生的人。

事情是这样的:

SELECT possibles.* 
FROM (
    SELECT tbl_event.ID AS eventID, tbl_employee.ID AS empID 
    FROM tbl_event, tbl_employee 
) AS possibles 
LEFT JOIN (
    SELECT tbl_date.da_f_event AS eventID, tbl_training.tr_f_employee AS empID 
    FROM tbl_date 
    INNER JOIN tbl_training ON tbl_date.ID = tbl_training.tr_f_date 
) AS actuals ON possibles.eventID = actuals.eventID AND possibles.empID = actuals.empID 
WHERE actuals.eventID IS NULL 

您可以从tbl_eventtbl_employeepossibles子查询添加更多的字段。


以下是连接类型的非正式描述:

INNER JOIN

仅包括记录其匹配上的连接两侧;复制该记录多个匹配

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event 
INNER JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event 

LEFT JOIN

包括从第一表中的所有记录,并且只记录其匹配从第二表。第二个表中没有匹配的行的第二个表的列将具有值NULL。复制多个匹配的记录。

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event 
LEFT JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event 

(还有RIGHT JOIN,这不相同,除了它反转表的顺序,我还没有找到任何很好的理由使用RIGHT JOIN,所以我建议你避免它。)

FULL OUTER JOIN(不支持Access)

包括两个表中的所有记录,即使没有匹配上的联接另一侧的给定记录。复制多个匹配的记录。

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event 
FULL OUTER JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event 

CROSS JOIN,AKA笛卡尔积

包括从第一个表中的第二个表中的每个记录每个记录。

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event, tbl_date 
+0

首先:感谢您的努力。不幸的是,我不需要一般“未使用”的事件,而是每个员工未使用的事件。我会相应地编辑这个问题,使其更加清晰... – Argee

+0

@Argee更新。 –

+0

主席先生,你是一位救星!非常感谢:) – Argee