使用group by编写查询的更好方法

des*_*lee 0 sql sql-server

我有两个SQL查询来查询电子邮件域计数如下.这是一个更好的方法吗?

似乎两个查询都返回完全相同的执行计划,但我不明白为什么会这样.

第一

SELECT emaildomain, 
       Count(email) AS Total 
FROM   (SELECT email, 
               Substring(email, Charindex('@', email) + 1, 
               Len(email) - Charindex('@', 
                            email)) 
               AS EmailDomain 
        FROM   [dbo].[tbluser]) A 
GROUP  BY emaildomain 
Run Code Online (Sandbox Code Playgroud)

第二

Select substring(email, charindex('@', Email) + 1,
Len(Email) - charindex('@', Email)) as EmailDomain,
count (Email) as Total
from [dbo].[tblUser]
GROUP BY substring(email, charindex('@', Email) + 1,
Len(Email) - charindex('@', Email))
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

执行计划应该是相同的.哪个更好取决于多种因素,但两者都应该没问题.

我想建议另一种选择:

SELECT v.emaildomain, count(*) as total
FROM dbo.tbluser u CROSS APPLY
     (VALUES (substring(u.email, Charindex('@', u.email) + 1, 
                        Len(u.email) - Charindex('@', u.email)
                       ) 
             )
     ) v(EmailDomain) 
GROUP BY vemaildomain ;
Run Code Online (Sandbox Code Playgroud)

APPLY实现称为"横向连接"的东西.这有很多用途.但一种用法是定义不需要子查询/ CTE的新列别名.

请注意,您还可以将此逻辑简化为:

     (VALUES ( stuff(u.email, 1, charindex('@', u.email) + 1, '') )
     ) v(EmailDomain) 
Run Code Online (Sandbox Code Playgroud)