在下面的代码中:
select t.id, ST_AsText(t.geom) AS tgeom, s.name, ST_Length(ST_ShortestLine(t.geom,s.geom)) AS short,t.par
from teta t, str_lines s
Where ST_Length(ST_ShortestLine(t.geom,s.geom))<200
ST_Length(ST_ShortestLine(t.geom,s.geom))执行了两次吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
当然它被执行了两次。
一旦进入你的where子句 并在列中出现别名代码。
那太糟糕了......所以我觉得制作我的表演会更好 自己的函数和缓存ST_Length(ST_ShortestLine(t.geom,s.geom)),呵呵?
请考虑以下事项:
创建表st_length_temp
选择ST_Length(ST_ShortestLine(t.geom,s.geom))作为长度
来自双重; - 或者无论你的甲骨文是对等的。
现在您的查询变为:
select t.id, ST_AsText(t.geom) AS tgeom, s.name,l.length AS short,t.par
from teta t, str_lines s, st_length_temp l
Where l.length < 200
答案 2 :(得分:0)
您可以尝试将其打包到子查询中,但我担心优化器会在应用连接条件之前首先创建笛卡尔积{teta * str_lines}。
SELECT id, tgeom, name, short, par
FROM( select t.id
, ST_AsText(t.geom) AS tgeom
, s.name
, ST_Length(ST_ShortestLine(t.geom,s.geom)) AS short
, t.par
from teta t, str_lines s
) pair
Where pair.short < 200
BTW:JOIN
语法版本做了什么?:
select t.id
, ST_AsText(t.geom) AS tgeom
, s.name
, ST_Length(ST_ShortestLine(t.geom,s.geom)) AS short
,t.par
from teta t
JOIN str_lines s ON ST_Length(ST_ShortestLine(t.geom,s.geom))<200
;