如何使用JOIN和SELECT更新MySQL的TblRemHp.tmp字段?
解决方案:用查询结果更新TblRemHp的tmp字段
你可以通过以下两种常用方式实现需求,根据你使用的数据库类型选择合适的写法:
方法1:使用UPDATE JOIN(推荐,适合MySQL、SQL Server等)
直接通过JOIN关联所有表,一次性完成更新,效率更高:
UPDATE TblRemHp JOIN TblCategorias ON TblRemHp.id_categoria = TblCategorias.id JOIN TblSubcategorias ON TblRemHp.id_subcategoria = TblSubcategorias.id AND TblSubcategorias.id_categoria = TblCategorias.id JOIN TblSub1 ON TblSub1.id_subcategoria = TblSubcategorias.id AND TblRemHp.id_filtro1 = TblSub1.c1 SET TblRemHp.tmp = TblSub1.id;
说明
原查询中的LEFT JOIN因为WHERE子句的等值判断,实际已经等价于INNER JOIN,直接改用INNER JOIN可以减少无效的数据关联,提升执行效率。
方法2:使用子查询(通用型,适配多数数据库)
如果你的数据库对UPDATE JOIN支持有限,可以用子查询写法:
UPDATE TblRemHp SET tmp = ( SELECT TblSub1.id FROM TblCategorias JOIN TblSubcategorias ON TblSubcategorias.id_categoria = TblCategorias.id JOIN TblSub1 ON TblSub1.id_subcategoria = TblSubcategorias.id WHERE TblRemHp.id_categoria = TblCategorias.id AND TblRemHp.id_subcategoria = TblSubcategorias.id AND TblRemHp.id_filtro1 = TblSub1.c1 ) WHERE EXISTS ( SELECT 1 FROM TblCategorias JOIN TblSubcategorias ON TblSubcategorias.id_categoria = TblCategorias.id JOIN TblSub1 ON TblSub1.id_subcategoria = TblSubcategorias.id WHERE TblRemHp.id_categoria = TblCategorias.id AND TblRemHp.id_subcategoria = TblSubcategorias.id AND TblRemHp.id_filtro1 = TblSub1.c1 );
说明
- 子查询会为每个
TblRemHp的匹配行找到对应的TblSub1.id并更新tmp字段 WHERE EXISTS子句用来过滤掉没有匹配结果的行,避免这些行的tmp被设置为NULL(如果不需要这个过滤,可以去掉该部分)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

