我更愿意在临时表上而不是派生表上进行自联接。
CREATE TEMPORARY TABLE foo AS SELECT ...;
SELECT ... FROM foo f1 JOIN foo f2 ON ...conditions...;
Run Code Online (Sandbox Code Playgroud)
与使用派生表相比,您必须将整个查询编写两次:
SELECT ...
FROM (SELECT ...)
JOIN (SELECT ...) ON ...conditions...;
Run Code Online (Sandbox Code Playgroud)
但另一种解决方案是使用与派生表略有不同的公共表表达式:
WITH foo AS (SELECT ...)
SELECT ... FROM foo f1 JOIN foo f2 ON ...conditions...;
Run Code Online (Sandbox Code Playgroud)
前提是您使用支持此语法的数据库品牌(Microsoft、Oracle、IBM、PostgreSQL)。