Как написать полный запрос внешнего соединения в доступе
Исходный запрос:
SELECT *
FROM AA
FULL OUTERJOIN BB on (AA.C_ID = BB.C_ID);
Как мне преобразовать запрос выше, чтобы сделать его совместимым в Microsoft Access?
Я предполагаю:
SELECT *
FROM AA
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID);
Я не рассматривал критерии "FULL", прежде чем правильно преобразовать первый запрос в запрос, совместимый с Access?
Ответы
Ответ 1
Предполагая, что в AA и BB нет одинаковых строк (т.е. все одинаковые значения), полное внешнее объединение является эквивалентом объединения левого соединения и правого соединения.
SELECT *
FROM AA
LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION
SELECT *
FROM AA
RIGHT JOIN BB ON AA.C_ID = BB.C_ID
Если есть повторяющиеся строки (и вы хотите их сохранить), добавьте WHERE AA.C_ID IS NULL
в конец или какое-либо другое поле, которое имеет значение null, если нет соответствующей записи из AA.
EDIT:
См. аналогичный подход здесь.
Он рекомендует более подробные, но более эффективные
SELECT *
FROM AA
JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
FROM AA
LEFT JOIN BB ON AA.C_ID = BB.C_ID
WHERE BB.C_ID IS NULL
UNION ALL
SELECT *
FROM AA
RIGHT JOIN BB ON AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL
Однако это предполагает, что AA.C_ID
и BB.C_ID
не являются нулевыми.
Ответ 2
Более эффективный и быстрый код:
SELECT *
FROM AA
LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
FROM AA
RIGHT JOIN BB ON AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL
Ответ 3
Я обнаружил, что если имена полей одинаковы в обеих таблицах, их нужно будет указывать отдельно, а не с помощью оператора *. Кроме того, второй оператор SELECT должен ссылаться на другую таблицу. Просто используя тот же SQL, что и первый, и изменив его на RIGHT JOIN, не позволяет включать строки в таблицу BB.
SELECT AA.C_ID
FROM AA
LEFT JOIN BB ON
AA.C_ID = BB.C_ID
UNION ALL
SELECT BB.C_ID
FROM BB
LEFT JOIN AA ON
AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL;