Может быть лучше изменить правую часть соединения без резервирования и просто добавить отдельную
имеет значение.
Универсальная версия:
SELECT (SELECT COUNT(*) FROM A LEFT JOIN B ON A.x = B.x)
+ (SELECT COUNT(*) FROM B LEFT JOIN A ON B.x = A.x WHERE A.x IS NULL)
AS outerJoinSize
;
Примечание: я изменил ПРАВОЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ и поменял местами столы; по моему опыту, RIGHT JOIN просто усложняет чтение запросов (особенно когда используется несколько объединений).
Совершенно другая альтернатива ...
SELECT
( SELECT SUM(dc1.c * IFNULL(ac1.c, 1)) AS jc
FROM (SELECT name, COUNT(*) AS c FROM directors GROUP BY name) AS dc1
LEFT JOIN (SELECT name, COUNT(*) AS c FROM actors GROUP BY name) AS ac1
ON dc1.name = ac1.name)
+ (SELECT SUM(IF(dc2.name IS NULL, ac2.c, 0)) AS jc
FROM (SELECT name, COUNT(*) AS c FROM actors GROUP BY name) AS ac2
LEFT JOIN (SELECT name, COUNT(*) AS c FROM directors GROUP BY name) AS dc2
ON ac2.name = dc2.name)
... это вычисляет, сколько совпадений основано на поле объединения (3 экземпляра «Боба» в режиссерах и 2 в актерах означают 6 результатов объединения для этого имени).