sql - 摆脱昂贵的自连接

标签 sql sql-server

我有一个这样的 SQL 语句

SELECT  
    pa.col1,
    SUM(ps.col2) col2,
    SUM(psl.col2) col2_previous_month
FROM  
    pa
LEFT JOIN 
    ps ON pa.Id = ps.Id AND ps.date = @currDate
LEFT JOIN 
    ps as psl ON psl.Id = ps.Id AND psl.date = dateadd(month, - 1, @currDate)
GROUP BY 
    pa.col1;

这个 SQL 经常被调用,因为表 ps有 100M 行左连接正在伤害。有没有办法使用 left Join 重写它?

问候
缺口

最佳答案

也许这会有所帮助

    Select pa.col1
          ,col2      =isnull(sum(case when ps.date=@currDate                   then ps.col2 else null end),0)
          ,col2_prior=isnull(sum(case when ps.date=dateadd(month,-1,@currDate) then ps.col2 else null end),0)
     From pa
     JOIN ps as ps ON pa.Id  = ps.Id 
      and ps.date in (@currDate,dateadd(month,-1,@currDate))
     Group By pa.col1

关于sql - 摆脱昂贵的自连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549535/

相关文章:

sql - 稍后在查询中使用 'AS ColumnName' 的值

sql-server - 两个表之间的TSQL业务规则实现

c# - Entity Framework 到远程服务器(连接字符串)

mysql - 给定一个形式为 "select a,b,c from t"的 SQL 语句及其输出,你能确定表 t 中的列数吗?

php - 从一个数据库中的多个表中选择最新记录(MYSQL PHP)

Mysql 使用新的数据库位置创建数据库

sql - Rails 应用程序 - 最好保留或删除过时的数据

sql-server - 事件状态总和,如 SQL Server 2012 中的 scd

sql-server - 有没有办法在 SQL Server 的列中存储类似数组的数据?

sql server group by datetime 截止点 10 :00am