当前位置:   article > 正文

MySQL - WITH...AS 创建临时表复用子查询_mysqlwithas调用二次

mysqlwithas调用二次

当我们遇到复杂 SQL 子查询的时候,发现表经常被复用的情况,按照传统的写法,就需要子查询 SQL 重复写,这样 SQL 很不优雅,今天我们用 WITH AS 来解决这个问题!(MySQL 8.0+ 开始支持)

  1. WITH t2 AS(
  2. WITH t1 AS(
  3. SELECT id, visit_date, people FROM Stadium WHERE people >= 100
  4. )
  5. SELECT id, visit_date, people, @gid:=IF(id - @preId = 1, @gid, @gid+1) groupId, @preId:=id
  6. FROM t1, (SELECT @preId:=(SELECT id FROM t1 LIMIT 0, 1), @gid:=0) init
  7. )
  8. SELECT id, visit_date, people
  9. FROM t2
  10. WHERE groupId IN (
  11. SELECT groupId
  12. FROM t2
  13. GROUP BY groupId
  14. HAVING COUNT(groupId) >= 3
  15. )

我们可以看到好多地方用到了 t1 和 t2,如果都采取传统子查询写法,我估计你要奔溃,而且没自信是否能一把过!

这里还有个地方需要注意,这里的临时表有 2 个,除了上面的嵌套的写法外,还可以这样写:

  1. WITH
  2. cte1 AS
  3. (
  4. select * from table1 where name like 'abc%'
  5. ),
  6. cte2 AS
  7. (
  8. select * from table2 where id > 20
  9. ),
  10. cte3 AS
  11. (
  12. select * from table3 where price < 100
  13. )
  14. select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
  • 这样有一个好处是:可以多个临时表被最后的 SELECT 语句复用,否则嵌套里面的临时表是无法被最后的 SELECT 复用的。 

 但是绝对不能下面这种写法:

  1. // 反例: 运行错误
  2. WITH t1 AS(
  3. SELECT id, visit_date, people FROM Stadium WHERE people >= 100
  4. )
  5. WITH t2 AS(
  6. SELECT id, visit_date, people, @gid:=IF(id - @preId = 1, @gid, @gid+1) groupId, @preId:=id
  7. FROM t1, (SELECT @preId:=(SELECT id FROM t1 LIMIT 0, 1), @gid:=0) init
  8. )
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/815722
推荐阅读
相关标签
  

闽ICP备14008679号