如何修改递归SQL查询以在结果中新增指定列?
解决方案
要在递归结果中保留触发查询的初始appsession.ID(即你标注的粗体字段),核心是在递归CTE的初始成员中捕获这个值,并在后续递归过程中持续传递它(因为递归是向上追溯根节点,初始ID不会改变)。
修改后的完整SQL如下:
WITH RECURSIVE RecursiveAppsessions AS ( -- 初始成员:捕获需要的APPSESSION_ID,并关联到对应的appsession记录 SELECT a.ID, a.ROOTAPPSESSIONID, sub.APPSESSION_ID FROM appsession a JOIN ( SELECT DISTINCT appsession.ID AS APPSESSION_ID, -- 这里就是你要保留的那个appsession.ID ANALYSISRESULTS.APPSESSIONID FROM appsession JOIN APIAPPLICATION ON APIAPPLICATION.ID = appsession.APIAPPLICATIONID AND APIAPPLICATION.NAME LIKE '%test%' JOIN PROPERTY ON PROPERTY.APPSESSIONID = appsession.ID AND PROPERTY.NAME = 'test' JOIN PROPERTYITEM ON PROPERTYITEM.PROPERTYID = PROPERTY.ID JOIN ANALYSISRESULTS ON ANALYSISRESULTS.ID = PROPERTYITEM.ANALYSISRESULTSID ) sub ON a.ID = sub.APPSESSIONID UNION ALL -- 递归成员:传递初始的APPSESSION_ID,继续向上追溯根节点 SELECT rec_a.ID, rec_a.ROOTAPPSESSIONID, ra.APPSESSION_ID FROM appsession rec_a INNER JOIN RecursiveAppsessions ra ON rec_a.ID = ra.ROOTAPPSESSIONID ) SELECT * FROM RecursiveAppsessions WHERE ROOTAPPSESSIONID IS NULL;
关键改动说明:
- 将原来的
WHERE ID IN (...)改为JOIN子查询,这样可以直接获取并保留你需要的appsession.ID(命名为APPSESSION_ID)。 - 在递归CTE的初始成员中新增
APPSESSION_ID字段,确保初始值被捕获。 - 递归成员中直接传递
ra.APPSESSION_ID,因为递归过程中我们只需要保留最初触发查询的那个ID,不需要修改它。
执行后会得到你期望的结果格式:
ID ROOTAPPSESSIONID APPSESSION_ID 33738427 Null 432432423
内容的提问来源于stack exchange,提问作者Claudiu Creanga
相关产品推荐
相关产品推荐

