sql - 使用count优化SQL查询

标签 sql sql-server sql-server-2008

我使用 ASP.NET 成员(member)资格,除此之外,我还添加了一些与用户具有一对多关系的表。

一个用户拥有多支笔、笔记本等。

我正在编写一个自定义成员(member)资格提供程序,并修改了选择查询以检索有关用户的所有信息以及用户拥有的笔数量和“工具”总数,但该查询显然执行灾难性的操作。 有办法获取这些信息吗? 这是我尝试过的:

SET STATISTICS TIME ON
SELECT  m.Email, m.PasswordQuestion, m.IsApproved, m.CreateDate, m.LastLoginDate,
        u.LastActivityDate, m.LastPasswordChangedDate, u.UserId, m.IsLockedOut, 
        m.LastLockoutDate, CAST(m.Comment as nvarchar(max)) as Comment, 
        COUNT(DISTINCT cl.Id) AS NumberOfPens, 
        COUNT(DISTINCT cf.Id)+
             COUNT(DISTINCT cm.Id) +
             COUNT(DISTINCT ce.Id) +
             COUNT(DISTINCT cl.Id) +
             COUNT(DISTINCT cp.Id) +
             COUNT(DISTINCT csl.Id)+
             COUNT(DISTINCT cs.Id) +
             COUNT(DISTINCT cshl.Id) AS NumberOfTools
FROM  aspnet_Membership AS m 
      INNER JOIN aspnet_Users AS u ON m.UserId = u.UserId 
      INNER JOIN Pens AS cf ON u.UserId = cf.Owner 
      INNER JOIN Notebooks AS cm ON u.UserId = cm.Owner 
      INNER JOIN Rulers AS ce ON u.UserId = ce.Owner 
      INNER JOIN Calculators AS cl ON u.UserId = cl.Owner 
      CROSS JOIN aspnet_Applications AS a
GROUP BY u.UserId, m.Email, m.PasswordQuestion, m.IsApproved, 
         m.CreateDate, m.LastLoginDate, u.LastActivityDate, 
         m.LastPasswordChangedDate, m.IsLockedOut, m.LastLockoutDate, 
         CAST(m.Comment as nvarchar(max))

SET STATISTICS TIME OFF

9 分 11 秒,91 位用户!

最佳答案

SELECT  m.Email, m.PasswordQuestion, m.IsApproved, m.CreateDate, m.LastLoginDate,
        u.LastActivityDate, m.LastPasswordChangedDate, u.UserId, m.IsLockedOut, 
        m.LastLockoutDate, CAST(m.Comment as nvarchar(max)) as Comment,
        penCount,
        notebookCount + rulerCount + calculatorCount AS toolCount
FROM    aspnet_Membership m
JOIN    aspnet_Users u
ON      u.userId = m.userId
CROSS APPLY
        (
        SELECT  COUNT(*)
        FROM    pens
        WHERE   owner = u.UserId
        ) p (penCount)
CROSS APPLY
        (
        SELECT  COUNT(*)
        FROM    notebooks
        WHERE   owner = u.UserId
        ) n (notebookCount)
CROSS APPLY
        (
        SELECT  COUNT(*)
        FROM    rulers
        WHERE   owner = u.UserId
        ) r (rulerCount)
CROSS APPLY
        (
        SELECT  COUNT(*)
        FROM    calculators
        WHERE   owner = u.UserId
        ) c (calculatorCount)

关于sql - 使用count优化SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8806832/

相关文章:

c# - ExecuteScalar 如果 DBNull 问题

mysql - 对文件的查询输出给出拒绝访问错误

c# - 仅当使用别名时 SqlDataReader.get_Item() 出现 System.IndexOutOfRangeException

sql - SSIS - 在另一个表上执行查找以获取相关列

xml - SQL 服务器 2008 : How to compare XML?

SQL 2008 设置兼容级别

mysql - sql中的交集

sql - 在 SSIS csv 导出中去除日期/时间分隔符

mysql - 从 MySQL 迁移到 SQL Server 时出现复杂查询的意外结果?

sql-server - 在 MS Reporting Services (SQL Server 2008) 中针对 ODBC 数据源使用参数