能否通过JOIN优化UPDATE语句?多嵌套SELECT改写需求
问题描述
我写了两条用于更新数据库行的SQL语句,示例如下:
更新RECIVER_DATA表的语句:
UPDATE RECIVER_DATA SET SURNAME = (SELECT JSON_VALUE(customMethodToConvert2JSON(content),'$.basicInformations') FROM PERSON_DATA PD WHERE PD.ID = (SELECT RD.ID_PERSON_DATA FROM RECIVER_DATA RD WHERE RD.PERSON_NUMBER = 'XYZ') ) WHERE PERSON_NUMBER = 'XYZ';
更新ORDER_DETAILS表的语句:
UPDATE ORDER_DETAILS SET SURNAME = (SELECT JSON_VALUE(customMethodToConvert2JSON(content),'$.basicInformations') FROM PERSON_DATA PD WHERE PD.ID = (SELECT RD.ID_PERSON_DATA FROM RECIVER_DATA RD WHERE RD.PERSON_NUMBER = 'XYZ') ) WHERE ORDER_ID = (SELECT RD.ID_ORDER FROM RECIVER_DATA RD WHERE RD.PERSON_NUMBER = 'XYZ');
我的数据库包含4个表,表关联逻辑为:RECIVER_DATA通过ID_PERSON_DATA关联PERSON_DATA,通过ID_ORDER关联ORDER_DETAILS。我尝试用JOIN改写但没成功,想问能不能用JOIN替换这些语句里多次对RECIVER_DATA的查询?
优化方案:使用JOIN改写UPDATE语句
当然可以用JOIN来优化,这样只需查询一次RECIVER_DATA表就能获取所需关联数据,减少重复查询,提升语句效率。
1. 更新RECIVER_DATA表的JOIN写法
UPDATE RD SET RD.SURNAME = JSON_VALUE(customMethodToConvert2JSON(PD.content), '$.basicInformations') FROM RECIVER_DATA RD JOIN PERSON_DATA PD ON RD.ID_PERSON_DATA = PD.ID WHERE RD.PERSON_NUMBER = 'XYZ';
直接将RECIVER_DATA与PERSON_DATA关联,一次性获取要更新的姓氏值,避免嵌套子查询多次访问RECIVER_DATA。
2. 更新ORDER_DETAILS表的JOIN写法
UPDATE OD SET OD.SURNAME = JSON_VALUE(customMethodToConvert2JSON(PD.content), '$.basicInformations') FROM ORDER_DETAILS OD JOIN RECIVER_DATA RD ON OD.ORDER_ID = RD.ID_ORDER JOIN PERSON_DATA PD ON RD.ID_PERSON_DATA = PD.ID WHERE RD.PERSON_NUMBER = 'XYZ';
通过两次JOIN,先关联ORDER_DETAILS和RECIVER_DATA,再关联PERSON_DATA,一次性拿到所有关联数据,仅查询一次RECIVER_DATA即可完成更新条件匹配和值的获取。
注:以上写法适用于支持
UPDATE ... JOIN语法的数据库(如SQL Server、MySQL等),若为Oracle等数据库,语法会略有调整,但核心逻辑一致——通过JOIN减少重复表访问。
内容的提问来源于stack exchange,提问作者Lulex97
相关产品推荐
相关产品推荐

