Подтвердить что ты не робот

Как написать полный запрос внешнего соединения в доступе

Исходный запрос:

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?

4b9b3361

Ответ 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;