Junção externa completa no MS Access


11

Eu tenho duas listas de funcionários:

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 eu preciso da seguinte saída:

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

Observe que os IDs da equipe da Lista A e da Lista B foram mesclados em uma lista única e não repetitiva e que eu mesclei os dois detalhes do supervisor que podem não corresponder entre as duas listas.

A consulta não precisa ser agradável. Eu tenho ~ 8000 registros em cada lista e executarei bem. Fico feliz em fazer algumas pequenas manipulações do Excel posteriormente, se necessário.

Eu queria fazer uma junção completa, mas a janela de propriedades do designer de consulta do Access na junção permite que eu escolha TODAS da tabela A e correspondendo à tabela B, TODAS da tabela B e correspondendo à tabela A, ou apenas aquelas que correspondam em ambos A e B.

Tenho certeza que isso é muito simples de fazer, mas raramente uso o MS Access.

Até agora, tenho duas consultas que não me dão o que quero. Eu queria combiná-los na junção externa completa, pois o Access não me dará uma opção, mas não sei como:

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;

Respostas:


10

A última vez que joguei com o Access foi quando 2003 foi a novidade, então isso pode não ser totalmente preciso para todos os detalhes. No entanto, o que você precisa fazer é ir para o designer de consultas, alterar a visualização para "SQL" (ou seja, entrada de texto bruto) e, em seguida, você deseja UNIONjuntar as duas consultas de junção esquerda, por exemplo

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

Eu amo que a resposta pode ser reduzido a uma única palavra: "União", que é exatamente o que eu queria :)
Ozzah

1
Sem problemas. Seria bom se o Access suportasse junções externas completas, mas também seria bom se eu também tivesse um pônei. (PS: Nem pergunte como fazer cruz junta no Access, é moderadamente horrível.)
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

Você tentou projetar a consulta no modo SQL em vez de usar a visualização do designer?

Se você estiver usando o Access 2003 / XP / 2000/97, consulte: http://www.techonthenet.com/access/queries/view_sql.php

Se você estiver usando o Access 2007/2010, poderá fazer isso clicando na seta no botão Exibir à esquerda da faixa de opções. Clique em 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.