基于多表内连接的SQL Update语句可行性问询(适配SSIS)
问题描述
我尝试基于另外两张表的内连接(两表通过对应列匹配)更新[dbo].[bos_output]表的多个字段,逻辑为:当该表的pnl列与[dbo].[bos_dim_code]表的code列匹配时,更新comment1和comment2字段。现有如下两段SQL语句:
更新语句
UPDATE [dbo].[bos_output] SET comment1 = "Invalid/Incomplete Record" SET comment2 = "Invalid P&L for Local LOB"
匹配数据查询语句
SELECT code FROM (SELECT distinct pnl FROM [dbo].[bos_output] where lob = 'LOB0002' GROUP BY pnl) t1 INNER JOIN (SELECT code FROM [dbo].[bos_dim_code] where code_status = 'Valid Code - EA new sector' GROUP BY code) t2 ON t1.pnl = t2.code
请问能否通过这些语句实现需求?我计划将其部署在SSIS中。
解答
现有两段语句无法实现你的需求,问题点和正确实现方式如下:
- 单独执行更新语句会直接修改
[dbo].[bos_output]的所有行,完全没有关联匹配逻辑,会把所有记录的comment1和comment2批量修改,不符合仅更新匹配行的要求。 - 匹配查询语句只是筛选出了符合条件的
pnl/code值,但没有和更新操作关联,无法驱动更新动作。
正确的关联更新SQL写法
你需要把匹配逻辑整合到更新语句中,以下是两种常用的可行写法:
方式一:使用JOIN关联表更新
UPDATE bo SET bo.comment1 = 'Invalid/Incomplete Record', bo.comment2 = 'Invalid P&L for Local LOB' FROM [dbo].[bos_output] bo INNER JOIN ( SELECT DISTINCT code FROM [dbo].[bos_dim_code] WHERE code_status = 'Valid Code - EA new sector' ) dc ON bo.pnl = dc.code WHERE bo.lob = 'LOB0002'
方式二:使用IN子句过滤匹配行
UPDATE [dbo].[bos_output] SET comment1 = 'Invalid/Incomplete Record', comment2 = 'Invalid P&L for Local LOB' WHERE lob = 'LOB0002' AND pnl IN ( SELECT code FROM [dbo].[bos_dim_code] WHERE code_status = 'Valid Code - EA new sector' )
SSIS部署注意事项
- 直接在SSIS的
Execute SQL Task中运行上述整合后的更新语句即可,无需拆分两段执行。 - SQL Server中字符串应使用单引号
',原语句中的双引号"可能引发语法错误,需要替换。 - 建议先在测试环境验证语句逻辑,确认仅目标行被更新后再部署到生产环境。
内容的提问来源于stack exchange,提问作者clayton55
相关产品推荐
相关产品推荐

