为什么MySQL不支持'LIMIT& IN / ALL / ANY / SOME子查询'

时间:2016-12-01 04:22:35

标签: mysql sql database mariadb

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

left outer join

并且每个答案都建议我们在这种情况下用in替换子查询。

在操作中支持限制子查询是一个很好的功能,因为许多子查询与.NET运算符一起使用,但是为什么MySQL开发组决定不将它带到MySQL,是否有任何原因使得这些运算符在子查询中是否存在危险或不良的性能?

2016年11月30日,作为Mysql 8.0最新的beta草案文档,MySQL仍然不支持这种子查询。

  

http://dev.mysql.com/doc/refman/8.0/en/subquery-errors.html

1 个答案:

答案 0 :(得分:1)

现在已经使用SQL(主要是Oracle和SQL Server)大约14年(主要是针对世界上最大公司的高要求环境);我强烈建议您检查一下您的工作方式 - 我从来没有需要以这种方式限制子查询的结果。

以下是我对您发送的链接中列出的每个方案的评论:

  1. 使用"限制"在子查询中:这将使谎言结果
  2. SELECT语句中子查询中的多个列 - 我理解一些有用的情况但是在SQL语句中读取可能会令人困惑,这就是为什么我认为它不受支持 - 我&#39 ;我不知道任何允许这种情况的数据库引擎,并且有几种方法可以正确地完成它。
  3. 子查询返回多行 - 是的,如果你想要一个等于的值,那么它必须等于另一个值,而不是列表;如果你想要一个列表中的任何值,那么它是一个不同的东西,因此需要不同的语法
  4. 更新与子查询中相同的表 - 技术限制,某些引擎会锁定表而不是行。我确定我已经做了很多事;得爱Oracle DB: - )

    我可能想到的限制子查询结果的唯一可能情况是只带一个数据样本,就像你想在日志或其他东西中带来错误计数而你只想要一个列随机样本(例如:[PROGRAM] [LOG COUNT] [ERR COUNT] [ERR EXAMPLE])...在这种非常罕见的情况下,我会理解限制子查询结果的用法,但为此您可以使用任何组通过MIN()或MAX()等函数。

    无论如何,如果您发现任何您认为需要限制子查询结果的场景并且不仅仅是带来数据样本 - 请再想一想,您的逻辑可能有问题;在这里询问是否属于这种情况: - )