在 where 子句中使用自联接和 group bys 优化查询

PBJ

这是我的旧查询:

Select AccountID,AccountDesc,
    CASE 
    WHEN NOT EXISTS (select AccountID from #B where #B.AccountID = P1.AccountID) THEN cast(cast(GETDATE() as date) as varchar)     
    ELSE cast(cast(CreateDate as date) as varchar)
    END 
    FROM #A P1
    WHERE P1.EndDate = (Select max(EndDate) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
    group by P2.AccountID) 
    and P1.StartDate = (Select max(StartDate) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
    group by P2.AccountID) 
    and P1.CreateDate = (Select max(CreateDate ) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
    group by P2.AccountID) 
    and P1.NewStartDate= (Select max(NewStartDate) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
    group by P2.AccountID)

我想在 where 子句中摆脱重复的自连接和 group bys,所以我摆脱了“Categ1 = F”部分,并将它放在工作表中 #A 的 where 子句中,而不是在我插入它时. 而且,我认为自联接只是为了获取 MAX 值,所以自从我制作了工作表,我认为我不再需要这种自联接。所以,我最终得到了这个新查询:

Select AccountID,AccountDesc,
    CASE 
    WHEN NOT EXISTS (select AccountID from #B where #B.AccountID = P1.AccountID) THEN cast(cast(GETDATE() as date) as varchar)     
    ELSE cast(cast(CreateDate as date) as varchar)
    END 
    FROM #A P1
    WHERE P1.EndDate = (Select max(EndDate) from #A)
    and P1.StartDate = (Select max(StartDate) from #A) 
    and P1.CreateDate = (Select max(CreateDate) from #A) 
    and P1.NewStartDate= (Select max(NewStartDate) from #A)

但这不是返回相同数量的记录,我相信是因为我还删除了 where 条件中的“Group By”子句?

有人可以帮助我更快地进行这个原始查询,但仍然返回相同的结果吗?

基思

您可以创建一个子查询并将其加入,以便计算发生一次。

;with cte as
(
select Account,max(EndDate) ED ,max(StartDate) SD,max(CreateDate ) CD ,max(NewStartDate) NSD 
from #a
where Categ1 = 'F'
group by Account
)
Select AccountID,AccountDesc,
    CASE 
    WHEN NOT EXISTS (select AccountID from #B where #B.AccountID = P1.AccountID) THEN cast(cast(GETDATE() as date) as varchar)     
    ELSE cast(cast(CreateDate as date) as varchar)
    END 
 FROM #A p1
     join cte on p1.Account=cte.Account
           and p1.StartDate=cte.SD
           and p1.EndDate = cte.ED
           and p1.CreateDate = cte.CD 
           and p1.NewStartDate=cte.NSD

这是另一个增强功能:

CASE 
    WHEN NOT EXISTS (select AccountID from #B where #B.AccountID = P1.AccountID) THEN cast(cast(GETDATE() as date) as varchar)     
    ELSE cast(cast(CreateDate as date) as varchar)

可以通过左加入#B来改变

;with cte as
(
select Account,max(EndDate) ED ,max(StartDate) SD,max(CreateDate ) CD ,max(NewStartDate) NSD 
from #a
where Categ1 = 'F'
group by Account
)
Select AccountID,AccountDesc,
    case when p2.Account is not null 
         then cast(CreateDate as varchar(10)) 
         else cast(cast(getdate() as date) as varchar(10)) end
 FROM #A p1
     join cte on p1.Account=cte.Account
           and p1.StartDate=cte.SD
           and p1.EndDate = cte.ED
           and p1.CreateDate = cte.CD 
           and p1.NewStartDate=cte.NSD
     left join #B p2 on p1.Account=p2.Account

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Select和where子句中优化MYSQL查询TIMEDIFF

来自分类Dev

使用WHERE子句中的子查询的Google BigQuery优化

来自分类Dev

使用WHERE子句中的and或and结构优化SQL查询

来自分类Dev

如何使用where子句中的max优化Oracle中的查询

来自分类Dev

MySQL优化使用WHERE子句的子查询?

来自分类Dev

SQL查询:在WHERE子句中使用AND / OR

来自分类Dev

在同一查询中使用Join,Group By,Having和Where子句

来自分类Dev

在WHERE子句中使用!=时,SELECT不起作用(使用GROUP BY和HAVING COUNT)

来自分类Dev

优化MySQL中的where子句查询

来自分类Dev

WHERE 子句上的 MySQL 查询优化

来自分类Dev

如何优化SQL Server查询的where子句

来自分类Dev

查询优化-WHERE子句中的表达式顺序

来自分类Dev

如何通过where子句中的计算优化sql查询速度

来自分类Dev

在where子句中使用group by进行条件计数

来自分类Dev

在where子句中使用group by进行条件计数

来自分类Dev

在where子句中使用OR优化SQL语句

来自分类Dev

MySql GROUP BY 使用文件排序 - 查询优化

来自分类Dev

如何在具有 Group By 子句的 SQL 查询的 where 子句中使用算术表达式而不会出现算术溢出?

来自分类Dev

如何使用子查询优化“ WHERE NOT IN”

来自分类Dev

在同一SQL查询中使用WHERE,HAVING和GROUP BY

来自分类Dev

在where子句中使用AVG函数和DATEADD进行嵌套查询

来自分类Dev

我在子查询 MySQL 的 Where 子句中使用 NOT IN 和 IF 是否正确?

来自分类Dev

休眠-无法在where子句中使用UserType执行查询

来自分类Dev

在Include语句中使用Where子句的Linq查询

来自分类Dev

在SQL查询的WHERE子句中使用表的值

来自分类Dev

在where子句中使用OR进行缓慢查询

来自分类Dev

在where子句中使用多个AND的SELECT查询

来自分类Dev

在动态where子句中使用子查询

来自分类Dev

在MySQL的where子句中使用多个表更新查询

Related 相关文章

  1. 1

    在Select和where子句中优化MYSQL查询TIMEDIFF

  2. 2

    使用WHERE子句中的子查询的Google BigQuery优化

  3. 3

    使用WHERE子句中的and或and结构优化SQL查询

  4. 4

    如何使用where子句中的max优化Oracle中的查询

  5. 5

    MySQL优化使用WHERE子句的子查询?

  6. 6

    SQL查询:在WHERE子句中使用AND / OR

  7. 7

    在同一查询中使用Join,Group By,Having和Where子句

  8. 8

    在WHERE子句中使用!=时,SELECT不起作用(使用GROUP BY和HAVING COUNT)

  9. 9

    优化MySQL中的where子句查询

  10. 10

    WHERE 子句上的 MySQL 查询优化

  11. 11

    如何优化SQL Server查询的where子句

  12. 12

    查询优化-WHERE子句中的表达式顺序

  13. 13

    如何通过where子句中的计算优化sql查询速度

  14. 14

    在where子句中使用group by进行条件计数

  15. 15

    在where子句中使用group by进行条件计数

  16. 16

    在where子句中使用OR优化SQL语句

  17. 17

    MySql GROUP BY 使用文件排序 - 查询优化

  18. 18

    如何在具有 Group By 子句的 SQL 查询的 where 子句中使用算术表达式而不会出现算术溢出?

  19. 19

    如何使用子查询优化“ WHERE NOT IN”

  20. 20

    在同一SQL查询中使用WHERE,HAVING和GROUP BY

  21. 21

    在where子句中使用AVG函数和DATEADD进行嵌套查询

  22. 22

    我在子查询 MySQL 的 Where 子句中使用 NOT IN 和 IF 是否正确?

  23. 23

    休眠-无法在where子句中使用UserType执行查询

  24. 24

    在Include语句中使用Where子句的Linq查询

  25. 25

    在SQL查询的WHERE子句中使用表的值

  26. 26

    在where子句中使用OR进行缓慢查询

  27. 27

    在where子句中使用多个AND的SELECT查询

  28. 28

    在动态where子句中使用子查询

  29. 29

    在MySQL的where子句中使用多个表更新查询

热门标签

归档