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:临时表方法谁更快?

数据库学习with as (补充 nvl 和 count 函数)

oracle with as 用法

PL/SQL with as 用法。

sql中with as的用法