如何将基于子表中一个字段中的值计算总数的5个子查询归为一个更新

普罗宁

我继承了一个解决方案,其中将存储过程作为后期处理触发,以计算子表中每种类型的公报的总数并更新父表。

如果到父级的子级行数超过2-3000,则查询不是最佳的,导致超时。

似乎可以通过将一种通信类型而不是5种不同的通信类型分组来解决此问题。

我在想类似这样的伪代码:

UPDATE Parent SET Total = query.Total, email = query.email, letter = query.letter, spoken = query.spoken, written = query.written
JOIN ... as query
WHERE Parent.ParentID = @pid

我的直觉是正确的还是SQL Server能够在内部对其进行优化?

添加索引可能是一种选择,但是据我所知,每个子查询都可以命中一个。

存储过程如下所示:

CREATE PROCEDURE [dbo].[UpdateParentTotal]
 @pid int
AS
UPDATE Parent
    -- count Total
set Total = (select count(*) from Child
               where Child.ParentID = Parent.ParentID),
    -- count Type "email" total
    email  = (select count(*) from Child
               where Child.ParentID = Parent.ParentID and Type = 1),
    -- count Type "letter" total
    letter   = (select count(*) from Child
               where Child.ParentID = Parent.ParentID and Type = 2),
    -- count Total for Spoken word
    spoken = (select count(*) from Child
               where Child.ParentID = Parent.ParentID and Type > 99),
    -- count all types of written word
    written = (select count(*) from Child
               where Child.ParentID = Parent.ParentID and ((Type > 1 and Type < 100) or Type is null))
where ParentID = @pid

GO

PS。给这个问题起个名字真的很困难,因为我不确切知道我需要哪种解决方案。

希金斯

您的想法是正确的……您可以将所有这些计算都放到一个查询中,然后连接到该查询。请参阅下面的示例。

UPDATE Parent
SET 
    Total = CountTotal,
    Email = CountEmail
    Letter = CountLetter
    Spoken = CountSpoken
    Written = CountWritten
FROM 
    Parent 
     INNER JOIN 
      (
        SELECT 
            ParentID,
            COUNT(*) CountTotal,
            COUNT(CASE WHEN [Type] = 1 THEN 1 END) AS CountEmail,
            COUNT(CASE WHEN [Type] = 2 THEN 1 END) AS CountLetter,
            COUNT(CASE WHEN [Type] >99 THEN 1 END) AS CountSpoken,
            COUNT(CASE WHEN (([Type] > 1 and [Type] < 100) or [Type] is null)) THEN 1 END) AS CountWritten,
        FROM Child
        GROUP BY ParentID
      ) Child ON 
        Parent.ParentID = Child.ParentID
WHERE Parent.ParentID = @pid 

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MYSQL | 从另一个字段中减去一个字段,但是创建了1个子查询字段

来自分类Dev

如何将一个字段的值聚合到一个数组中?

来自分类Dev

如何计算表中一个字段的总和并将其放入输入中

来自分类Dev

在基于MySQL中另一个字段的子查询中使用LIMIT

来自分类Dev

如何将两个字段(不同)查询到一个字段中

来自分类Dev

如何将两个字段(不同)查询到一个字段中

来自分类Dev

如何在查询中添加基于另一个字段的字段

来自分类Dev

如何将两个查询合并到一个子查询中

来自分类Dev

如何将字段汇总为一个字段?

来自分类Dev

如何将一个字段解析为同一个表中的多个字段?

来自分类Dev

如何将一个表中的两个字段关联到另一个表中的一个字段

来自分类Dev

如何将一个字段与mongodb中的组合字段进行比较

来自分类Dev

更新mysql中的2个字段(其中一个更新为null更新)

来自分类Dev

使用远程链接gsp时如何将一个字段的值设置为参数

来自分类Dev

如何将LIKE语句与另一个字段中的多个值一起使用?

来自分类Dev

如何将LIKE语句与另一个字段中的多个值一起使用?

来自分类Dev

当其中一个字段为空但您需要一个值时,查找最近的数字

来自分类Dev

Elasticsearch将每个文档的ID更新为文档中另一个字段的值

来自分类Dev

Elasticsearch将每个文档的ID更新为文档中另一个字段的值

来自分类Dev

如何在formik中基于另一个字段设置一个字段的输入值?

来自分类Dev

从表中得到一个随机记录,其中一个字段为空

来自分类Dev

如何使用XQuery将一个字段的值设置为另一个字段

来自分类Dev

如何将数据从一个字段复制到SQL Server中不同行中的另一个字段

来自分类Dev

如何将多行连接到SQL Server中的一个字段

来自分类Dev

如何将多维数组中的一个字段转换为小写?

来自分类Dev

如何将多行连接到SQL Server中的一个字段

来自分类Dev

如何构建其中一个字段引用另一个字段的结构

来自分类Dev

如何将一个子域重写为另一个子域?

来自分类Dev

MongoDB:查询文档,其中一个字段等于其子文档字段之一?

Related 相关文章

  1. 1

    MYSQL | 从另一个字段中减去一个字段,但是创建了1个子查询字段

  2. 2

    如何将一个字段的值聚合到一个数组中?

  3. 3

    如何计算表中一个字段的总和并将其放入输入中

  4. 4

    在基于MySQL中另一个字段的子查询中使用LIMIT

  5. 5

    如何将两个字段(不同)查询到一个字段中

  6. 6

    如何将两个字段(不同)查询到一个字段中

  7. 7

    如何在查询中添加基于另一个字段的字段

  8. 8

    如何将两个查询合并到一个子查询中

  9. 9

    如何将字段汇总为一个字段?

  10. 10

    如何将一个字段解析为同一个表中的多个字段?

  11. 11

    如何将一个表中的两个字段关联到另一个表中的一个字段

  12. 12

    如何将一个字段与mongodb中的组合字段进行比较

  13. 13

    更新mysql中的2个字段(其中一个更新为null更新)

  14. 14

    使用远程链接gsp时如何将一个字段的值设置为参数

  15. 15

    如何将LIKE语句与另一个字段中的多个值一起使用?

  16. 16

    如何将LIKE语句与另一个字段中的多个值一起使用?

  17. 17

    当其中一个字段为空但您需要一个值时,查找最近的数字

  18. 18

    Elasticsearch将每个文档的ID更新为文档中另一个字段的值

  19. 19

    Elasticsearch将每个文档的ID更新为文档中另一个字段的值

  20. 20

    如何在formik中基于另一个字段设置一个字段的输入值?

  21. 21

    从表中得到一个随机记录,其中一个字段为空

  22. 22

    如何使用XQuery将一个字段的值设置为另一个字段

  23. 23

    如何将数据从一个字段复制到SQL Server中不同行中的另一个字段

  24. 24

    如何将多行连接到SQL Server中的一个字段

  25. 25

    如何将多维数组中的一个字段转换为小写?

  26. 26

    如何将多行连接到SQL Server中的一个字段

  27. 27

    如何构建其中一个字段引用另一个字段的结构

  28. 28

    如何将一个子域重写为另一个子域?

  29. 29

    MongoDB:查询文档,其中一个字段等于其子文档字段之一?

热门标签

归档