初始MySQL中的derived table还是在一个偶然的问题场景中。
下面的语句在执行的时候抛出了错误。
UPDATE payment_data rr SET rr.penalty_date = '2017-4-12' where rr.id = (SELECT min(r.id) FROM payment_data r where data_no = (SELECT data_no FROM user_debt WHERE out_trade_no = 'bestpay_order_no1491812746329'));
ERROR 1093 (HY000): You can't specify target table 'rr' for update in FROM clause 如果对MySQL查询优化器足够了解就会明白,其实这种方式是MySQL不支持的,有没有WA呢,还是有的,那就是通过一种特殊的子查询来完成,也就是derived table
所以上面的语句使用如下的方式就可以破解。
UPDATE payment_data rr SET rr.penalty_date = '2017-4-12' where rr.id = (SELECT min(t.id) FROM (select id,data_no from payment_data r) t where t.data_no = (SELECT data_no FROM user_debt WHERE out_trade_no = 'bestpay_order_no1491812746329')); 我们回到刚刚提到的Derived table,在官方文档中是这么说的。
Derived tables is the internal name for subqueries in the FROM clause.为了充分说明derived table,我还是举例倒霉的t_fund_info这个表。
首先查看两条数据,作为我们测试的基础数据,其中id是主键列.
|