Я бы предпочел сделать self-join на временной таблице, чем производная таблица.
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).
Это [вопрос помечен для SQL Server] (HTTP : //stackoverflow.com/questions/2326395/which-one-have-better-performance-derived-tables-or-temporary-tables), поэтому информация должна рассматриваться как специфическая для него, а не для всех баз данных. –