有两个版本的答案,其中一个使用a SubQuery,另一个使用a CTE来解决相同的问题.
那么,使用CTE (Common Table Expression)over as 的优点是什么ub-query(因此,查询实际上更具可读性)
使用CTEover sub select 的唯一优点是我可以实际命名子查询.当CTE用作简单(非递归)CTE时,这两者之间是否存在其他差异?
这是一个关于SQL Server 2008 R2的问题
到目前为止,我不是DBA.我是一名java开发人员,必须不时编写SQL.(主要嵌入代码中).我想知道我在这里做错了什么,如果是的话,我可以做些什么来避免它再次发生.
Q1:
SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Run Code Online (Sandbox Code Playgroud)
Q1有14个连接
Q2与Q1相同,但有一个例外.(SELECT*FROM T1 WHERE condition1)之前执行,并存储在临时表中.
这不是相关的子查询.
Q2:
SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable JOIN ...
Run Code Online (Sandbox Code Playgroud)
再次,14加入.
现在让我感到困惑的是,Q1花了> 2分钟(尝试了几次,以避免缓存发挥作用),而Q2(两个查询合并)花了2秒!是什么赋予了?
我有一个子查询(LastActivityOn),我想在三个地方使用,我的投影(SELECTed输出),ORDER BY和WHERE子句.
SELECT TOP 175
(SELECT MAX(ActivityDate) FROM (VALUES
(UserRegistration.CreatedOn),
(UserRegistration.ActivatedOn),
(UserRegistration.LastLoginOn),
(UserRegistration.UpdatedOn),
(UserProfile.LastPostedOn)) AS AllDates(ActivityDate)) LastActivityOn,
UserRegistration.FirstName,
UserRegistration.LastName,
[15 more columns of various calculated distances, coalesces, etc...]
FROM
UserRegistration
INNER JOIN UserProfile ON UserRegistration.Id = UserProfile.RegistrationId
INNER JOIN (
SELECT PostalCode, GeoCenter, PrimaryCity, StateOrProvince
FROM PostalCodes
WHERE @OriginPostalCode IS NULL OR PostalCodes.GeoCenter.STDistance(@OriginPoint) < @WithinMeters
) AS ProximalPostalCodes ON ProximalPostalCodes.PostalCode = UserRegistration.PostalCode
[7 more joins including full-text queries]
WHERE
LastActivityOn > @OldestUserToSearch AND
[20 more lines of filtering …Run Code Online (Sandbox Code Playgroud) 我一直在研究一种解决方案(在SQL Server中),其中所有没有异常的子查询都已使用临时表重写,以提高性能.
举个例子,所有的查询都是这样的:
SELECT something
FROM (SELECT * FROM T1 WHERE condition1)
JOIN ...
Run Code Online (Sandbox Code Playgroud)
被重写为这样:
SELECT *
INTO #tempTable
FROM T1
WHERE condition1
SELECT something
FROM #tempTable
JOIN ...
Run Code Online (Sandbox Code Playgroud)
这里还建议所有子查询都应该避免使用临时表.
基于给定的事实,是否应该用临时表替换所有子查询?如果不是什么时候应该考虑另一个?