为什么mysql子查询中不能用limit而临时表能呢?

时间:2021-07-29 09:50:38
RT,MYSQL现在版本子查询中不支持limit,也就是 select * from xx1 where id in (select id from xx2 limit 100)会提示语法错误。

但是如果写成select * from xx1 where id in (select tmp.id from (select id from xx2 limit 100) as tmp) 就没问题。

想讨论下,这个问题的来由是什么呢?

5 个解决方案

#1


select * from xx1 a inner join 
(select id from xx2 limit 100) b
on a.id=b.id 

#2


这样也是可以的。。
那为什么这样可以而在子查询里不行呢。。。

#3


没有什么为什么,这是MYSQL本身的限制。

#4


引用 2 楼 sealala 的回复:
这样也是可以的。。
那为什么这样可以而在子查询里不行呢。。。

语法

#5


用in的时候,非关联子查询不也是先执行子查询保存在内存中然后再拿外层的行来比较么?

那为什么select * from xx1 where id in (select tmp.id from (select id from xx2 limit 100) as tmp) 这样反而就没问题了。

mysql提示的是不支持子查询中使用limit。上面这个语法和出错那个语法有什么本质区别么?如果没有,单纯做这个语法限制的动机是什么呢?

引用 3 楼 acmain_chm 的回复:
没有什么为什么,这是MYSQL本身的限制。

#1


select * from xx1 a inner join 
(select id from xx2 limit 100) b
on a.id=b.id 

#2


这样也是可以的。。
那为什么这样可以而在子查询里不行呢。。。

#3


没有什么为什么,这是MYSQL本身的限制。

#4


引用 2 楼 sealala 的回复:
这样也是可以的。。
那为什么这样可以而在子查询里不行呢。。。

语法

#5


用in的时候,非关联子查询不也是先执行子查询保存在内存中然后再拿外层的行来比较么?

那为什么select * from xx1 where id in (select tmp.id from (select id from xx2 limit 100) as tmp) 这样反而就没问题了。

mysql提示的是不支持子查询中使用limit。上面这个语法和出错那个语法有什么本质区别么?如果没有,单纯做这个语法限制的动机是什么呢?

引用 3 楼 acmain_chm 的回复:
没有什么为什么,这是MYSQL本身的限制。