MySQL - WITH...AS 创建临时表复用子查询
Posted Lux_Sun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL - WITH...AS 创建临时表复用子查询相关的知识,希望对你有一定的参考价值。
当我们遇到复杂 SQL 子查询的时候,发现表经常被复用的情况,按照传统的写法,就需要子查询 SQL 重复写,这样 SQL 很不优雅,今天我们用 WITH AS 来解决这个问题!(MySQL 8.0+ 开始支持)
WITH t2 AS(
WITH t1 AS(
SELECT id, visit_date, people FROM Stadium WHERE people >= 100
)
SELECT id, visit_date, people, @gid:=IF(id - @preId = 1, @gid, @gid+1) groupId, @preId:=id
FROM t1, (SELECT @preId:=(SELECT id FROM t1 LIMIT 0, 1), @gid:=0) init
)
SELECT id, visit_date, people
FROM t2
WHERE groupId IN (
SELECT groupId
FROM t2
GROUP BY groupId
HAVING COUNT(groupId) >= 3
)
我们可以看到好多地方用到了 t1 和 t2,如果都采取传统子查询写法,我估计你要奔溃,而且没自信是否能一把过!
这里还有个地方需要注意,这里的临时表有 2 个,不能并级写,只能嵌套的写法。
// 反例: 运行错误
WITH t1 AS(
SELECT id, visit_date, people FROM Stadium WHERE people >= 100
)
WITH t2 AS(
SELECT id, visit_date, people, @gid:=IF(id - @preId = 1, @gid, @gid+1) groupId, @preId:=id
FROM t1, (SELECT @preId:=(SELECT id FROM t1 LIMIT 0, 1), @gid:=0) init
)
以上是关于MySQL - WITH...AS 创建临时表复用子查询的主要内容,如果未能解决你的问题,请参考以下文章
转:SQL数据库中临时表临时变量和WITH AS关键词创建“临时表”的区别
SELECT INTO vs WITH AS:临时表方法谁更快?