如何在SQL存储过程中合并两个SELECT返回带programStarts的单数据表
问题根因
- UNION/UNION ALL 是用来纵向拼接两个结果集(行叠加),要求两个查询的列数、列类型完全一致,你的需求是横向关联统计结果和其他表字段,完全不适用这个语法。
- 第一个查询的统计结果是独立的临时结果集,没有被第二个查询引用,所以第二个查询无法识别
programStarts字段。
解决方案
使用公用表表达式(CTE)先存储统计结果,再通过关联查询合并你需要的字段即可,修改后的存储过程代码如下:
ALTER PROCEDURE [dbo].[testing2] @startdate datetime, @enddate datetime AS BEGIN -- 先统计programStarts存入CTE WITH HitStats AS ( SELECT inst_id, Count(type) AS programStarts FROM Archive_Hits WHERE type<>'New' AND accessed_on BETWEEN CAST(@startdate AS date) AND CAST(@enddate AS date) GROUP BY inst_id ) -- 关联多表获取最终结果 SELECT apu.email, ai.product_market, ai.install_code, ISNULL(hs.programStarts, 0) AS programStarts FROM Archive_ProgUsers apu INNER JOIN Archive_Installations ai ON apu.id = ai.user_id LEFT JOIN HitStats hs ON ai.id = hs.inst_id ORDER BY hs.programStarts DESC END
补充说明
如果只需要返回有对应访问统计的安装记录,将代码中的LEFT JOIN改为INNER JOIN即可;如果不需要无统计时默认返回0的逻辑,去掉ISNULL包裹直接写hs.programStarts即可。
内容的提问来源于stack exchange,提问作者codernon
相关产品推荐
相关产品推荐

