我有一个子查询(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 logic]
ORDER BY
LOG(DATEDIFF(WEEK, LastActivityOn, @Today))/LOG(2),
FullTextRelevance
请注意 LastActivityOn 的三个事件。另请注意,LastActivityOn 子查询引用了两个表。我想因为它依赖于父查询中的连接子句,它本质上是一个相关的子查询?
当我只通过用户定义函数获取最多两个日期时,我能够在 WHERE 和 ORDER BY 中使用结果值。我现在不可以。
似乎我有几个选择......我可以将整个事情包装在另一个查询中,仅使用添加的活动重复投影。看来我可以以同样的方式使用“WITH”(CTE)。
但是因为我不清楚何时可以和不能以我想要的方式使用子查询的规则,所以我很容易遗漏一些东西。有任何想法吗?
或者也许 SQL SERVER 足够聪明,只为每个输出行执行一次计算,我不应该担心吗?
编辑:目前正在运行 SQL Server 2008 Standard,但升级将在某个时候按顺序进行。此外,RE:日志功能 - 我正在努力将其与相关性结合为加权总数,因此这是一项正在进行的工作。我将使用 INT 对其进行修剪以用作一种排名,或者通过线性调整将其添加到相关性中。
更正:我能够在我的 ORDER BY 中使用子查询别名,但不能使用任何额外的计算或 where 子句。感谢 ypercube 指出这一点。