版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/H_233/article/details/87795483
总结一下平时写业务sql遇到的问题。。
有这么一个需求,首先表结构信息如下图所示:
想要查询出slaveMerchantNo为M100077750或者M100065707,且bindStatus为30的最后一次出现的记录,为该记录设置unbindTime当前系统时间。
对于第一个条件我们slaveMerchantNo IN ('M100077750', 'M100065707'),然后在AND bindStatus = 30就可以,但是我们想要查询的是最后一条,因为一个slaveMerchantNo可能有多条记录,所以我们要进行分组(GROUP BY slaveMerchantNo ),然后再筛选出最后一条,这里可以条件判断为时间最大,但因为这张表加了自增itemID,所以直接使用了MAX(itemID),这样同样可以选出最后一条。于是,我们的sql是这样的:
UPDATE tbl_fsm_settle_activity_mergeRecord
SET unbindTime = NOW()
WHERE
itemID IN (
SELECT
MAX(itemID) itemID
FROM
tbl_fsm_settle_activity_mergeRecord
WHERE
slaveMerchantNo IN ('M100077750', 'M100065707')
AND bindStatus = 30
GROUP BY
slaveMerchantNo
)
执行发现报错,错误信息如下:
1093-You can’t specify target table for update in FROM clause
该错误原因是:mysql不允许update目标表和子查询里面的表为同一张表。也就是update语句中包含的子查询的表和update的表为同一张表时,就会报上面这样的错误。所以为了避免这个错误,我们可以给子查询再嵌套一层,最终sql如下:
UPDATE tbl_fsm_settle_activity_mergeRecord
SET unbindTime = NOW()
WHERE
itemID IN (
SELECT
tb1.itemID
FROM
(
SELECT
MAX(itemID) itemID
FROM
tbl_fsm_settle_activity_mergeRecord
WHERE
slaveMerchantNo IN ('M100077750', 'M100065707')
AND bindStatus = 30
GROUP BY
slaveMerchantNo
) tb1
)
这样的话,mysql就会认为再update中的子查询是查的tb1这张表,就不会再报错了。