Unión externa completa en MS Access


11

Tengo dos listas de personal:

List A:

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

y

List B:

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

Y necesito el siguiente resultado:

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

Tenga en cuenta que las ID de personal de la Lista A y la Lista B se han fusionado en una única lista que no se repite, y que he fusionado los dos detalles del supervisor que pueden no coincidir entre las dos listas.

La consulta no tiene que ser agradable. Tengo ~ 8000 registros en cada lista y lo ejecutaré bien. Estoy feliz de hacer una pequeña manipulación de Excel luego si es necesario.

Quería hacer una combinación completa, pero la ventana de propiedades del diseñador de consultas de Access en la combinación me permite elegir TODOS de la tabla A y coincidir de la tabla B, TODOS de la tabla B y coincidir de la tabla A, o solo aquellos que coinciden en ambos A y B.

Estoy seguro de que esto es muy simple de hacer, pero rara vez uso MS Access.

Tengo dos consultas hasta ahora que no me dan lo que quiero. Quería combinarlos en la combinación externa completa, ya que Access no me dará una opción, pero no estoy seguro de cómo:

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

y

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

Respuestas:


10

La última vez que jugué con Access fue cuando el 2003 fue lo más nuevo, por lo que esto puede no ser del todo exacto en cada detalle. Sin embargo, lo que debe hacer es ir al diseñador de consultas, cambiar la vista a "SQL" (es decir, entrada de texto sin formato) y luego desea que UNIONsus dos consultas de unión izquierda se unan, por ejemplo

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

Me encanta que la respuesta se reduzca a una sola palabra: "UNIÓN", que es exactamente lo que quería :)
Ozzah

1
No hay problema. Sería bueno si Access admitiera uniones externas completas, pero también sería bueno si tuviera un pony también. (PD: Ni siquiera preguntes cómo hacer uniones cruzadas en Access, es moderadamente horrible.)
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

¿Has intentado diseñar la consulta en modo SQL en lugar de usar la vista de diseñador?

Si está utilizando Access 2003 / XP / 2000/97, eche un vistazo a esto: http://www.techonthenet.com/access/queries/view_sql.php

Si está utilizando Access 2007/2010, puede hacerlo haciendo clic en la flecha del botón Ver a la izquierda de la cinta. Luego haga clic en Vista 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.