完全外部加入MS Access


11

我有两个工作人员名单:

List A:

StaffID   Supervisor
====================
0001234         NULL
0001235      0001234
0001237      0001234
0001239      0001237

List B:

StaffID   Supervisor
====================
0001234         NULL
0001235      0001234
0001238      0001235
0001239      0001235

我需要以下输出:

StaffID   SupervisorA   SupervisorB
===================================
0001234          NULL          NULL
0001235       0001234       0001234
0001237       0001234          NULL
0001238          NULL       0001235
0001239       0001237       0001235

请注意,列表A和列表B中的员工ID已合并到一个非重复列表中,并且我已经合并了两个主管明细,这两个列表之间可能不匹配。

查询不必很好。每个列表中都有大约8000条记录,我会很好地运行它。如有必要,我很乐意在以后进行一些小的Excel操作。

我想进行完全联接,但是联接上的Access查询设计器属性窗口使我可以从表A中选择“全部”,从表B中选择“匹配”,从表B中选择“ ALL”并从表A进行匹配,或者仅选择两者都匹配的和B。

我敢肯定这很简单,但是我很少使用MS Access。

到目前为止,我有两个查询无法满足我的需求。我想将它们合并到完整的外部联接中,因为Access不会给我一个选择,但不确定如何:

SELECT ListA.*, ListB.*
FROM ListA LEFT JOIN ListB ON ListA.[StaffID] = ListB.StaffID;

SELECT ListA.*, ListB.*
FROM ListB LEFT JOIN ListA ON ListB.[StaffID] = ListA.StaffID;

Answers:


10

我上一次与Access一起玩的时间是2003年,当时才是热门话题,因此对于每个细节来说,这可能都不是完全准确的。但是,您需要做的是去查询设计器,将视图更改为“ SQL”(即原始文本输入),然后UNION将两个左联接查询一起使用,例如

SELECT ListA.*, ListB.*
FROM ListA LEFT JOIN ListB ON ListA.[StaffID] = ListB.StaffID
UNION
SELECT ListA.*, ListB.*
FROM ListB LEFT JOIN ListA ON ListB.[StaffID] = ListA.StaffID

我喜欢将答案简化为一个词:“ UNION”,这正是我想要的:)
Ozzah 2012年

1
没问题。如果Access支持完全外部联接会很好,但是如果我也有小马的话也很好。(PS:甚至不问如何在Access中进行交叉联接,这相当糟糕。)
Simon Righarts 2012年

1
SELECT S.StaffId
     , ListA.Supervisor AS SupervisorA 
     , ListB.Supervisor AS SupervisorB
FROM 
    ( SELECT StaffID
      FROM ListA 
    UNION 
      SELECT StaffID
      FROM ListB
    ) AS S
  LEFT JOIN ListA 
    ON ListA.StaffID = S.StaffID
  LEFT JOIN ListB 
    ON ListB.StaffID = S.StaffID

0

您是否尝试过以SQL模式设计查询而不是使用设计器视图?

如果您使用的是Access 2003 / XP / 2000/97,请查看以下内容:http : //www.techonthenet.com/access/queries/view_sql.php

如果您使用的是Access 2007/2010,则可以通过单击功能区左侧的“查看”按钮上的箭头来执行此操作。然后单击“ SQL视图”。


0
SELECT ListA.*, ListB.*
FROM ListA LEFT JOIN ListB ON ListA.[StaffID] = ListB.[StaffID]
UNION
SELECT ListA.*, ListB.*
FROM ListA RIGHT JOIN ListB ON ListA.[StaffID] = ListB.[StaffID];

0
SELECT ListA.staffID, ListA.Supervisor, ListB.Supervisor
FROM ListA LEFT JOIN ListB ON ListA.staffID = ListB.staffID
WHERE (((ListB.staffID) Is Null))
UNION
SELECT ListB.staffID, ListA.Supervisor, ListB.Supervisor
FROM ListA RIGHT JOIN ListB ON ListA.staffID = ListB.staffID
WHERE (((ListA.staffID) Is Null))
UNION
SELECT ListA.staffID, ListA.Supervisor, ListB.Supervisor
FROM ListA INNER JOIN ListB ON ListA.staffID = ListB.staffID
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.