"A derived table cannot contain references to other tables of the same SELECT"是什么意思?I looked it up in the MySQL documentation

SELECT
  salesperson.name,
  max_sale.amount,
  max_sale_customer.customer_name
FROM
  salesperson,
  -- calculate maximum size, cache it in transient derived table max_sale
  LATERAL
  (SELECT MAX(amount) AS amount
    FROM all_sales
    WHERE all_sales.salesperson_id = salesperson.id)
  AS max_sale,
  -- find customer, reusing cached maximum size
  LATERAL
  (SELECT customer_name
    FROM all_sales
    WHERE all_sales.salesperson_id = salesperson.id
    AND all_sales.amount =
        -- the cached maximum size
        max_sale.amount)
  AS max_sale_customer;

A derived table cannot contain references to other tables of the same SELECT (use a LATERAL derived table for that; see Section 13.2.11.9, “Lateral Derived Tables”)

推荐答案

理解这一点的关键在于您阅读的手册:

派生表在查询持续时间内必须是常数,不包含对其他FROM子句表的列的引用.

也就是说,在读取连接表中的任何行之前,将派生表视为在查询的初始时间运行.如果派生表子查询包含对连接表的任何引用,则派生表的结果将取决于从这些表中读取的数据.可能与派生表为常量的要求冲突.

LATERAL改变了这一点.它确保在查询开始从连接的表中读取行之后,对派生表进行判断.

P、 美国:上面贾尔赫的 comments 并不完全正确.出于其他原因,建议使用显式JOIN语法(例如,它支持外部连接等),但出于LATERAL的考虑,这不是必需的.

Mysql相关问答推荐

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

mysql使用LIKE查找二进制字段有问题

慢查询日志(log)甚至包括快速查询,因为它包括等待锁定所花费的时间

根据上一行S列结果计算列的查询

根据SQL中的平均范围对学生进行排名

docker-compose:无法将应用程序服务连接到 mysql 数据库,收到错误:用户‘root’@‘localhost’访问被拒绝(使用密码:YES)

MySQL Join 查询位置从订单

在表中找到最大值,然后分别显示SQL组和每个SQL组中的最大值计数

组平SQL查询结果

SQL UPDATE中的str_replace?

通过数据库级​​别本身的查询反序列化

MySQL - 如何在 INSERT 语句中将字符串值解析为 DATETIME 格式?

用于国际和多语言目的的数据库建模

MySQL 实用程序 - ~/.my.cnf 选项文件

MySQL术语约束与外键的区别?

在 MySQL 中签名或未签名

在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD()

MySQL 1062 - 键 'PRIMARY' 的重复条目 '0'

MySQL 的最大并发连接数

PHP MYSQL - 插入不使用列名但使用自动增量字段