简短回答:很多时候可以,但不总能完全替代临时表。
下面分场景说清楚。
典型场景:
你有一张表,需要先算中间结果,再基于中间结果做进一步查询。
CREATE TEMP TABLE t1 AS
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id;
SELECT *
FROM t1
WHERE total > 1000;
SELECT o1.user_id
FROM orders o1
JOIN orders o2
ON o1.user_id = o2.user_id
GROUP BY o1.user_id
HAVING SUM(o2.amount) > 1000;
⚠️ 注意:
上面这个例子其实不是典型自连接用途,更常见的是“同一张表不同行之间比较”。
-- 找每个员工的经理
SELECT e.name, m.name AS manager
FROM emp e
JOIN emp m
ON e.manager_id = m.id;
✅ 这种情况:
-- 上一条订单
SELECT a.id, b.id AS prev_id
FROM orders a
LEFT JOIN orders b
ON a.user_id = b.user_id
AND b.id < a.id;
✅ 自连接是标准做法
多表 JOIN + 窗口函数 + 聚合 + 过滤
自连接会导致:
✅ 临时表 / CTE 更清晰
结果集被 JOIN 三次
自连接 = 算三次
临时表 = 算一次
✅ 临时表性能更好
比如:
❌ 自连接做不到
很多时候,临时表 ≠ 必须,可以用:
WITH t AS (
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
)
SELECT * FROM t WHERE total > 1000;
优点:
自连接可以替代“简单、单次、行关系型”的临时表;
但复杂计算、复用结果、多步骤处理,临时表(或 CTE)更合适。
如果你有具体 SQL 场景,我可以直接帮你判断「该用自连接还是临时表」。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。