如何合并两个SQL查询从SEDE获取热门问题及对应最高得分答案
SEDE热门问题及对应最高赞答案合并查询实现
UNION 仅适用于合并结构一致的上下行结果集,无法实现横向追加关联字段的需求,你可以通过公用表表达式(CTE)+APPLY 关联的方式实现需求,完整可运行代码如下:
WITH HotQuestions AS ( SELECT TOP 10 'https://stackoverflow.com/questions/' + CONVERT(VARCHAR, Posts.Id) as url, (ViewCount / (-DATEDIFF(DAY, GETDATE(), CreationDate))) AS ave_views_per_day, Body as QUESTION, Posts.Id, Title FROM Posts LEFT JOIN PostTags ON Posts.Id = PostTags.PostId LEFT JOIN Tags ON PostTags.TagId = Tags.Id WHERE TagName IN ('##tag##') AND ViewCount > 10000 ORDER BY ave_views_per_day DESC ) SELECT q.*, ans.HighestScoringAnswer FROM HotQuestions q OUTER APPLY ( SELECT TOP 1 Body AS HighestScoringAnswer FROM (SELECT p.Body, DENSE_RANK() OVER (ORDER BY p.Score DESC) Rank FROM Posts p WHERE p.ParentId = q.Id AND p.PostTypeId = 2 -- 确保匹配的是答案类型内容 ) x ORDER BY Rank ASC ) ans
关键逻辑说明
- 先通过CTE
HotQuestions存储你原有逻辑查询得到的TOP10热门问题结果,保留所有你需要的字段 - 不需要手动传递
##QuestionId##参数,OUTER APPLY操作会自动将每行热门问题的Id传入子查询的p.ParentId = q.Id过滤条件,逐行匹配对应问题的最高得分答案 OUTER APPLY会保留无答案的问题记录,对应HighestScoringAnswer字段值为NULL;如果你需要仅保留有对应答案的问题,可将OUTER APPLY替换为CROSS APPLY- 子查询中额外增加了
PostTypeId=2的过滤条件,避免匹配到评论、其他类型的帖子内容,结果更精准
内容的提问来源于stack exchange,提问作者Pericror Bot
相关产品推荐
相关产品推荐

