Full Outer Соедините два запроса из одной таблицы в MS Access
Вопрос: Есть ли другой способ эмулировать полное внешнее объединение в MS Access - НЕ использовать UNION или UNION ALL?
Описание: полное внешнее объединение эмулируется в MS Access с использованием UNION. Однако два запроса, использующих одну и ту же таблицу только с разными фильтрами для формирования набора результатов, не могут быть объединены с помощью UNION, поскольку он просто поместит результаты запроса обратно в один столбец, из которого они были запрошены.
Контекст: данные состоят из ответов от 100 организаций, охватывающих семь лет. Разные организации каждый год, разные ответы на организацию в год, 75% текстовых ответов.
Структура данных: организационная таблица; Таблица вопросов; Таблица ответов; Ссылка Таблица, чтобы связать организации, вопросы, ответы через идентификатор. (Встроенный в SQL Server)
Цель: запрос набора ответов, связанных с одним вопросом, и сравнение набора с другим набором ответов, связанных с другим вопросом. (Количество строк в результирующих запросах отличается от запроса к запросу, и запросы должны объединяться без потери данных с левой или правой стороны)
Сборка внешнего интерфейса в MS Access.
Кодировка в SQL Server:
SELECT M.ORG_DESC, M.YEAR, M.RESP_DESC, N.ORG_DESC, N.YEAR, N.RESP_DESC
FROM
(SELECT C.RESP_RANK, C.ORG_DESC, A.YEAR, B.RESP_DESC
FROM LINK A
INNER JOIN RESPONSE B
ON A.RESP_ID = B.RESP_ID
INNER JOIN ORG_LOG C
ON A.ORG_ID = C.ORG_ID
WHERE A.QUESTION_ID = 10840) M
FULL OUTER JOIN
(SELECT C.RESP_RANK, C.ORG_DESC, A.YEAR, B.RESP_DESC
FROM LINK A
INNER JOIN RESPONSE B
ON A.RESP_ID = B.RESP_ID
INNER JOIN ORG_LOG C
ON A.ORG_ID = C.ORG_ID
WHERE A.QUESTION_ID = 10850) N
ON M.RESP_RANK = N.RESP_RANK
Результат желал для:
Query1_ORG_DESC Query1_YEAR Query1_RESP_DESC Query2_ORG_DESC Query2_YEAR Query2_RESP_DESC
-------------- ----------- ---------------- --------------- ----------- ----------------
A 2010 Q A 2010 R
NULL NULL NULL A 2011 S
B 2010 T NULL NULL NULL
Результаты при использовании UNION:
Query1_ORG_DESC Query1_YEAR Query1_RESP_DESC
-------------- ----------- ----------------
A 2010 Q /*result from Query1*/
A 2010 R /*result from Query2*/
A 2011 S /*result from Query2*/
B 2010 T /*result from Query1*/
1 ответ
Мои извенения
Решение действительно СОЮЗ.
Моя ошибка заключалась в использовании UNION напрямую с двумя запросами. Правильный метод - создание всего левого внешнего запроса с двумя запросами, затем создание всего правого внешнего запроса с двумя запросами и, наконец, использование UNION (ограничение правого запроса данными, для которых левый запрос равен нулю).
Эта ссылка объясняет это адекватно