加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何重用SELECT,WHERE和ORDER BY子句的结果?

发布时间:2021-02-24 18:48:25 所属栏目:MsSql教程 来源:网络整理
导读:以下查询返回我们附近的场地(lat:62.0,lon:25.0),其中我们按照距离排列的半径: SELECT *,earth_distance(ll_to_earth(62.0,25.0),ll_to_earth(lat,lon)) AS distance FROM venues WHERE earth_distance(ll_to_earth(62.0,lon)) = radius ORDER BY earth_di

以下查询返回我们附近的场地(lat:62.0,lon:25.0),其中我们按照距离排列的半径:

SELECT *,earth_distance(ll_to_earth(62.0,25.0),ll_to_earth(lat,lon)) AS distance 
FROM venues 
WHERE earth_distance(ll_to_earth(62.0,lon)) <= radius 
ORDER BY earth_distance(ll_to_earth(62.0,lon))

是否可以(并且建议)重复使用earth_distance(ll_to_earth(62.0,lon))的结果,而不是单独为SELECT,WHERE和ORDER BY子句计算它?

解决方法

在GROUP BY和ORDER BY子句中,您可以引用列别名(输出列)或甚至SELECT列表项的序号.我引用 the manual on ORDER BY

Each expression can be the name or ordinal number of an output column
(SELECT list item),or it can be an arbitrary expression formed from
input-column values.

大胆强调我的.

但是在WHERE和HAVING子句中,您只能引用基表(输入列)中的列,因此您必须拼出函数调用.

SELECT *,lon)) AS dist
FROM   venues 
WHERE  earth_distance(ll_to_earth(62.0,lon)) <= radius 
ORDER  BY distance;

如果您想知道将计算打包到CTE或子查询中是否更快,只需使用EXPLAIN ANALYZE进行测试即可. (我对此表示怀疑.)

SELECT *
FROM  (
   SELECT *,lon)) AS dist
   FROM   venues
   ) x
WHERE  distance <= radius 
ORDER  BY distance;

与@Mike commented一样,通过声明函数STABLE(或IMMUTABLE),您可以通知查询计划程序,对于单个语句中的相同调用,函数调用的结果可以重复使用多次.我引用the manual here:

A STABLE function cannot modify the database and is guaranteed to
return the same results given the same arguments for all rows within a
single statement. This category allows the optimizer to optimize
multiple calls of the function to a single call.

大胆强调我的.

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读