Pełne dołączenie zewnętrzne w MS Access


11

Mam dwie listy pracowników:

List A:

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

i

List B:

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

Potrzebuję następujących danych wyjściowych:

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

Zauważ, że identyfikatory pracowników z Listy A i Listy B zostały połączone w jedną, niepowtarzalną listę i że połączyłem dwa dane nadzorcy, które mogą nie pasować między dwiema listami.

Zapytanie nie musi być miłe. Mam ~ 8000 rekordów na każdej liście i ładnie to uruchomię. W razie potrzeby chętnie wykonam drobne operacje w programie Excel.

Chciałem wykonać pełne sprzężenie, ale okno właściwości projektanta zapytań Access na sprzężeniu pozwala mi wybrać WSZYSTKIE z tabeli A i dopasowanie z tabeli B, WSZYSTKIE z tabeli B i dopasowanie z tabeli A lub tylko te, które pasują do obu A oraz b.

Jestem pewien, że jest to bardzo proste, ale bardzo rzadko używam MS Access.

Mam do tej pory dwa zapytania, które nie dają mi tego, czego chcę. Chciałem połączyć je w pełnym złączeniu zewnętrznym, ponieważ Access nie daje mi opcji, ale nie jestem pewien, jak:

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

i

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

Odpowiedzi:


10

Ostatnim razem, gdy grałem z Access, było to, że 2003 był nowością, więc może to nie być do końca dokładne w każdym detalu. Musisz jednak przejść do projektanta zapytań, zmienić widok na „SQL” (tj. Wprowadzanie nieprzetworzonego tekstu), a następnie chcesz UNIONpołączyć dwa zapytania połączone lewą stroną, np.

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

Uwielbiam to, że odpowiedź można sprowadzić do jednego słowa: „UNION”, czyli tego właśnie chciałem :)
Ozzah

1
Nie ma problemu. Byłoby miło, gdyby Access obsługiwał pełne połączenia zewnętrzne, ale byłoby również miło, gdybym miał kucyka. (PS: Nawet nie pytaj, jak wykonywać połączenia krzyżowe w programie Access, jest to średnio okropne.)
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

Czy próbowałeś zaprojektować zapytanie w trybie SQL zamiast korzystać z widoku projektanta?

Jeśli korzystasz z Access 2003 / XP / 2000/97, spójrz na to: http://www.techonthenet.com/access/queries/view_sql.php

Jeśli korzystasz z programu Access 2007/2010, możesz to zrobić, klikając strzałkę na przycisku Widok po lewej stronie wstążki. Następnie kliknij Widok 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.