GreatSQL社区

搜索

[已解决] mysql update子查询问题

1000 6 2022-12-3 10:36

在本测试例子中,select id from (select max(id) from t1 where c2 = 1) aaa;是一个语法错误,应该为select m_id from (select max(id) as m_id from t1 where c2 = 1) aaa;

但是作为一个子查询却没有报错。


全部回复(6)
空空如也 2022-12-3 10:37:59
这个问题,是不是应该是mysql解析器解析有问题?感觉上来说,作为子查询的也应该能解析出错误的吧?
yejr 2022-12-3 13:36:30
空空如也 发表于 2022-12-3 10:37
这个问题,是不是应该是mysql解析器解析有问题?感觉上来说,作为子查询的也应该能解析出错误的吧? ...

正确的做法是要加上别名才行,例如
  1. select id from (select max(id) id from t1 where c2 = 1) aaa;
复制代码


不这么做的话,下面的update结果就不是预期的,你可以写入测试数据后自己看下。

我测试的版本:8.0.27
空空如也 2022-12-3 18:35:04
yejr 发表于 2022-12-3 13:36
正确的做法是要加上别名才行,例如

是的,但是为什么解析不报错呢
空空如也 2022-12-3 18:51:35
空空如也 发表于 2022-12-3 18:35
是的,但是为什么解析不报错呢

还是说这个语法就是正确的?那为什么单独select是正确的?
张旭峰 2022-12-4 16:42:02
在本测试例子中,select id from (select max(id) from t1 where c2 = 1) aaa;是一个语法错误,应该为select m_id from (select max(id) as m_id from t1 where c2 = 1) aaa;

但是作为一个子查询却没有报错。

root@mysqldb 16:34:  [db1]> desc update t1 set c2=4 where id = ( select  id from (select max(id)  from t1   where c2 =1 ) aaa);
+----+--------------------+------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type        | table      | partitions | type   | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+--------------------+------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
|  1 | UPDATE             | t1         | NULL       | index  | NULL          | PRIMARY | 4       | NULL |    1 |   100.00 | Using where |
|  2 | DEPENDENT SUBQUERY | <derived3> | NULL       | system | NULL          | NULL    | NULL    | NULL |    1 |   100.00 | NULL        |
|  3 | DERIVED            | t1         | NULL       | ALL    | NULL          | NULL    | NULL    | NULL |    1 |   100.00 | Using where |
+----+--------------------+------------+------------+--------+---------------+---------+---------+------+------+----------+-------------+
3 rows in set, 2 warnings (0.01 sec)

root@mysqldb 16:34:  [db1]>
root@mysqldb 16:34:  [db1]>
root@mysqldb 16:34:  [db1]> show warnings\G;
*************************** 1. row ***************************
  Level: Note
   Code: 1276
Message: Field or reference 'db1.t1.id' of SELECT #2 was resolved in SELECT #1
*************************** 2. row ***************************
  Level: Note
   Code: 1003
Message: update `db1`.`t1` set `db1`.`t1`.`c2` = 4 where (`db1`.`t1`.`id` = (/* select#2 */ select `db1`.`t1`.`id` from (/* select#3 */ select max(`db1`.`t1`.`id`) AS `max(id)` from `db1`.`t1` where (`db1`.`t1`.`c2` = 1)) `aaa`))
2 rows in set (0.00 sec)

ERROR:
No query specified

看执行计划 看优化器 把原来的SQL 改写成怎么样了 改完都是标准的语法 所以写SQL一定要写好标量,写完SQL记得看执行计划预估SQL效率啥的, 第一个报错是语法检查问题
空空如也 2022-12-5 10:00:55
张旭峰 发表于 2022-12-4 16:42
在本测试例子中,select id from (select max(id) from t1 where c2 = 1) aaa;是一个语法错误,应该为selec ...

好的,感谢。感觉直接报错可能更符合常理
空空如也

2

主题

0

博客

52

贡献

注册会员

Rank: 2

积分
62

2022年度博学人物2022年度活跃用户

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-11-25 12:19 , Processed in 0.022224 second(s), 18 queries , Redis On.
快速回复 返回顶部 返回列表