Я бы предпочел сделать самосоединение для временной таблицы, чем для производной таблицы.
CREATE TEMPORARY TABLE foo AS SELECT ...;
SELECT ... FROM foo f1 JOIN foo f2 ON ...conditions...;
По сравнению с использованием производной таблицы, где вы должны написать весь запрос дважды:
SELECT ...
FROM (SELECT ...)
JOIN (SELECT ...) ON ...conditions...;
Но другое решение заключается в использовании общих табличных выражений , которые немного отличаются от производных таблиц:
WITH foo AS (SELECT ...)
SELECT ... FROM foo f1 JOIN foo f2 ON ...conditions...;
При условии, что вы используете марку базы данных, которая поддерживает этот синтаксис (Microsoft, Oracle, IBM, PostgreSQL).