Partecipazione esterna completa a MS Access


11

Ho due liste del personale:

List A:

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

e

List B:

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

E ho bisogno del seguente output:

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

Si noti che gli ID personale dell'elenco A e dell'elenco B sono stati uniti in un unico elenco non ripetuto e che ho unito i due dettagli del supervisore che potrebbero non corrispondere tra i due elenchi.

La query non deve essere piacevole. Ho ~ 8000 record in ogni elenco e lo farò funzionare bene. Sono felice di fare qualche piccola manipolazione di Excel in seguito, se necessario.

Volevo fare un join completo, ma la finestra delle proprietà di Progettazione query di accesso sul join mi consente di scegliere TUTTO dalla tabella A e la corrispondenza dalla tabella B, TUTTO dalla tabella B e la corrispondenza dalla tabella A, o solo quelli che corrispondono in entrambi A e B.

Sono sicuro che questo è molto semplice da fare, ma uso molto raramente MS Access.

Finora ho due domande che non mi danno quello che voglio. Volevo combinarli nel join esterno completo, poiché Access non mi offre un'opzione, ma non sono sicuro di come:

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

e

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

Risposte:


10

L'ultima volta che ho suonato con Access è stato quando il 2003 è stato la novità assoluta, quindi potrebbe non essere del tutto accurato in ogni dettaglio. Tuttavia, ciò che devi fare è andare a Query Designer, cambiare la vista in "SQL" (ovvero immissione di testo non elaborato) e quindi vuoi insieme le UNIONtue due query di sinistra, ad es.

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

Adoro che la risposta possa essere ridotta all'unica parola: "UNIONE", che è esattamente quello che volevo :)
Ozzah

1
Nessun problema. Sarebbe bello se Access supportasse i join esterni completi, ma sarebbe bello anche se avessi un pony. (PS: non chiedere nemmeno come fare i join incrociati in Access, è moderatamente terribile.)
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

Hai provato a progettare la query in modalità SQL invece di utilizzare la vista designer?

Se stai utilizzando Access 2003 / XP / 2000/97, dai un'occhiata a questo: http://www.techonthenet.com/access/queries/view_sql.php

Se si utilizza Access 2007/2010, è possibile farlo facendo clic sulla freccia sul pulsante Visualizza a sinistra della barra multifunzione. Quindi fare clic su 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.