为什么MySQL不支持‘LIMIT&IN/ALL/ANY/SOUN子查询’

vfhzx4xs  于 2022-12-10  发布在  Mysql
关注(0)|答案(1)|浏览(104)

几乎每个人都遇到过此子查询错误:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery

在这种情况下,每个答案都建议我们用left outer join替换子查询。
支持带有In操作的Limit子查询是一个很好的功能,因为很多子查询都是与in运算符一起使用的,但为什么MySQL开发团队决定不将其带到MySQL中,是否有什么原因使在子查询中使用这些运算符的Limit变得危险或性能不佳?
2016年11月30日,作为MySQL 8.0最新的测试版文档草案,MySQL仍然不支持这种子查询。
http://dev.mysql.com/doc/refman/8.0/en/subquery-errors.html

avwztpqn

avwztpqn1#

以下是我对您发送链接中列出的每个场景的评论:
1.在子查询中使用“限制”:这将导致错误/错误和不一致的结果(因为由于当前的缓存和优化,子查询将在不同的时间返回不同的行,即使没有数据更改)
1.在SELECT语句内的子查询中有多列--我知道这在某些情况下很有用,但读入SQL语句可能会令人困惑,这就是我认为它不受支持的原因--我不知道有任何数据库引擎会允许这样做,有几种方法可以正确地做到这一点。
1.子查询返回多行-是的,如果您想要一个相等的值,那么它必须等于另一个值,而不是列表;如果您想要列表中的任何值,那么它就是另一回事,因此需要不同的语法
1.更新子查询中相同的表-技术限制,某些引擎锁定表而不是行。我相信我已经做过很多次了;我一定很喜欢Oracle DB:-)
为了限制子查询的结果,我能想到的唯一可能的方案是只带来一个数据样本,例如,如果您想要在日志或其他内容中带来错误计数,并且您只想要一个随机样本的列(例如:[PROGRAM][LOG COUNT][ERR Example])……在这种非常罕见的情况下,我会理解限制子查询结果的用法,但对于这种情况,您可以使用一些GROUP BY函数,如MIN()MAX()和绝对NOTLIMIT
为了更直接地回答“为什么MySQL不支持‘Limit&IN/All/Any/Some子查询’”这一主要问题,因为如果您尝试选择像data in (select data... LIMIT...)这样的数据,您基本上是在尝试选择data in (some random data),因为LIMIT将阻止某些行出现在子查询结果中,并且无法确定哪些行。
无论如何,如果您发现您认为需要限制子查询结果的任何场景,并且它不只是带来一个数据样本-再想一想,您的逻辑可能有问题;请询问以下情况是否属实:-)

相关问题