Полное внешнее соединение в 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 были объединены в один неповторяющийся список, и что я объединил две детали супервизора, которые могут не совпадать между двумя списками.

Запрос не должен быть хорошим. У меня есть ~ 8000 записей в каждом списке, и я буду работать хорошо. Я рад сделать некоторые незначительные манипуляции с Excel впоследствии, если это необходимо.

Я хотел сделать полное объединение, но окно свойств конструктора запросов Access в соединении позволяет мне выбрать ALL из таблицы A и сопоставление из таблицы B, ALL из таблицы B и сопоставление из таблицы A или только те, которые совпадают в обоих A и Б.

Я уверен, что это очень просто сделать, но я очень редко использую 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;

Ответы:


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

Мне нравится, что ответ можно свести к одному слову: «СОЮЗ», а это именно то, что я хотел :)
Озза

1
Нет проблем. Было бы хорошо, если бы Access поддерживал полные внешние соединения, но было бы неплохо, если бы у меня тоже был пони. (PS: даже не спрашивайте, как сделать перекрестные объединения в Access, это умеренно ужасно.)
Саймон Ригартс

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 View.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.