Ваше кросс-соединение вовсе не FULL OUTER JOIN
. Это внутреннее соединение, которое также соответствует NULL для всех записей.
В CROSS JOIN
строки из одной таблицы всегда сопоставляются со строками из другой таблицы, в то время как в FULL OUTER JOIN
есть строки, которые ничем не соответствуют.
Для иллюстрации я создал небольшой образец (T-SQL, но это не актуально). Вы можете видеть, что возвращается неравный ряд.
Однако вы можете использовать CROSS JOIN
для эмуляции FULL OUTER JOIN
, если нет значений Null
, добавив строку Null
, используя NOT EXISTS
и некоторые другие приемы. Однако вы увидите, что это очень сложное решение, и обычно предпочитается обычный UNION
:
SELECT *
FROM (SELECT * FROM #Table1 UNION ALL SELECT Null, Null) t1, (SELECT * FROM #Table2 UNION ALL SELECT Null, Null) t2
WHERE (t1.JoinField = t2.JoinField
OR (NOT EXISTS(SELECT 1 FROM #Table2 WHERE #Table2.JoinField = t1.JoinField) AND t1.JoinField Is Not Null AND t2.JoinField IS NULL)
OR (NOT EXISTS(SELECT 1 FROM #Table1 WHERE #Table1.JoinField = t2.JoinField) AND t2.JoinField Is Not Null AND t1.JoinField IS NULL))
AND (t1.JoinField Is Not Null Or t2.JoinField Is Not Null)
(в связанном примере вы можете увидеть его в действии)