我有两个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)
执行计划应该是相同的.哪个更好取决于多种因素,但两者都应该没问题.
我想建议另一种选择:
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)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |