如何将更新Adserver表与关联查询的两条SQL语句合并为一条?
合并UPDATE与查询为单条SQL语句的解决方案
没问题!可以把你这两条SQL合并成一条,不过得结合你使用的SQL方言特性来调整——从你用到WITH子句和数据集命名风格来看,我默认你用的是BigQuery这类支持CTE内更新的现代SQL环境。
合并后的完整SQL语句
WITH UpdatedAdserver AS ( -- 执行原QUERY1的更新操作 UPDATE FRIDAY.Adserver SET C_date = CURRENT_DATE() WHERE C_date IS NULL RETURNING * -- 返回被更新的行(这里核心是确保更新动作完成,后续查询会覆盖所有当日数据) ), FilteredDailyData AS ( -- 筛选所有当日的Adserver数据(含刚更新的+原本就是当日的行) SELECT * FROM FRIDAY.Adserver WHERE C_date = CURRENT_DATE() ), JoinedMatchingData AS ( -- 沿用原QUERY2的关联逻辑 SELECT * FROM FilteredDailyData JOIN FRIDAY.Matching_Table1 ON FilteredDailyData.Placement_ExtID = Matching_Table1.string_field_1 OR FilteredDailyData.Placement_ExtID = Matching_Table1.string_field_0 ), FinalResult AS ( -- 生成New_IDS字段,和原QUERY2逻辑一致 SELECT *, CONCAT(CAST(Date AS STRING), "-", JoinedMatchingData.string_field_0) AS New_IDS FROM JoinedMatchingData ) SELECT * FROM FinalResult;
代码说明
UpdatedAdserverCTE:负责完成原QUERY1的更新任务,把所有C_date IS NULL的行设置为当前日期。RETURNING *是可选的(这里我们没直接使用返回的行),但它能确保更新动作在后续查询执行前完成。FilteredDailyDataCTE:筛选出所有C_date等于当前日期的行,和原QUERY2的FirstCTE逻辑完全一致,包含了刚被更新的行以及原本就是当日的行。- 后续的
JoinedMatchingData和FinalResult完全沿用你原QUERY2的关联、字段生成逻辑,保证最终结果和分开执行两条语句的效果一致。
兼容旧SQL环境的替代方案
如果你的SQL环境不支持在CTE内执行UPDATE(比如旧版本MySQL),无法写成严格意义上的单条语句,但可以用事务包裹两条语句,确保它们原子性执行:
BEGIN TRANSACTION; -- 执行原QUERY1 UPDATE FRIDAY.Adserver SET C_date = CURRENT_Date() Where C_date IS NULL ; -- 执行原QUERY2 With First As( select * from FRIDAY.Adserver where C_date = Current_date() ), Second As( select * from First JOIN FRIDAY.Matching_Table1 ON First.Placement_ExtID = Matching_Table1.string_field_1 OR First.Placement_ExtID = Matching_Table1.string_field_0 ), Tird As( Select *, CONCAT(Cast(Date as String),"-",Second.string_field_0) AS New_IDS from Second ) Select * from Tird; COMMIT;
内容的提问来源于stack exchange,提问作者Fadi
相关产品推荐
相关产品推荐

