Необъяснимое поведение в MS Access полного внешнего объединения? - PullRequest
2 голосов
/ 24 августа 2011

Я пытаюсь выполнить полное внешнее объединение двух таблиц CMVSC и TOXOSC в MS Access, чтобы проверить, какие идентификаторы содержатся в обеих / только в одной из таблиц:

(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
(SELECT * FROM TOXOSC LEFT JOIN CMVSC ON TOXOSC.ID = CMVSC.ID);

Запрос может быть выполнен, но не дает ожидаемого результата.

Первые несколько записей (отсортированных по возрастанию по идентификатору) в CMVSC:

ID      CMV_NEGDATE CMV_POSDATE
10245   04.02.2010  28.06.1999
10642   08.10.1998  05.09.1991

Первые несколько записей (отсортированных по возрастанию по идентификатору) в TOXOSC:

ID      TOXO_NEGDATE TOXO_POSDATE
10120   22.11.1993   05.04.1991
10261   09.02.1998   23.02.1996

А вот первые две записи из вышеприведенного запроса:

CMVSC.ID CMV_NEGDATE CMV_POSDATE TOXOSC.ID TOXO_NEGDATE TOXO_POSDATE
10120    22.11.1993  05.04.1991         
10245    04.02.2010  28.06.1999         

Обратите внимание, как запись из TOXOSC присваивается переменным CMV*, так же как запись из CMVSC.

Как это возможно?

1 Ответ

4 голосов
/ 24 августа 2011

Причина в том, что первый подзапрос имеет сначала таблицу CMVSC, а затем TOXOSC.Второй подзапрос имеет их в обратном порядке.UNION принимает столбцы по мере их поступления и использует в качестве столбцов заголовки заголовков первого подзапроса (следовательно, микширование).Попробуйте это:

( SELECT CMVSC.*, TOXOSC.* FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
( SELECT CMVSC.*, TOXOSC.* FROM TOXOSC LEFT JOIN CMVSC ON TOXOSC.ID = CMVSC.ID);

Другим способом было бы использовать LEFT и RIGHT объединение:

(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
(SELECT * FROM CMVSC RIGHT JOIN TOXOSC ON TOXOSC.ID = CMVSC.ID);
...