Повне зовнішнє приєднання до 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

Зауважте, що ідентифікаційні дані співробітників зі списку А та списку В були об'єднані в єдиний, повторюваний список, і що я об'єднав дві дані керівника, які можуть не збігатися між двома списками.

Запит не повинен бути приємним. Я маю ~ 8000 записів у кожному списку, і буду запускати це добре. Я радий зробити невеликі маніпуляції в Excel, якщо це необхідно.

Я хотів зробити повне приєднання, але вікно властивостей дизайнера запитів доступу при з'єднанні дозволяє мені вибирати ВСЕ з таблиці А та збігатися з таблиці В, ВСЕ з таблиці В та відповідати таблиці А або лише ті, які відповідають обом 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

Мені подобається, що відповідь можна звести до одного слова: "Союз", саме цього я хотів :)
Ozzah

1
Без проблем. Було б добре, якби Access підтримував повні зовнішні приєднання, але також було б непогано, якби у мене теж був поні. (PS: Навіть не питайте, як зробити перехресні з'єднання в Access, це помірно жахливо.)
Simon Righarts

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.