子查询中的SQL多个别名

时间:2018-03-28 04:46:54

标签: sql postgresql postgis

我有一个设置,我想在空间查询中支持用户定义的子查询来识别重叠的多边形。以下是一个例子:

SELECT i1.id, i2.id
FROM
    (SELECT * FROM Images WHERE id > 600) i1,
    (SELECT * FROM Images WHERE id > 600) i2
WHERE ST_INTERSECTS(i1.footprint_latlon, i2.footprint_latlon) = TRUE
AND i1.id > i2.id

以上是有效的,但我更有规范的方法来做到这一点。

内部查询在这里完全是任意的,重要的组成部分是我使用相同的查询定义i1i2。我这样做是为了让外部空间查询有i1i2个别名。

是否有必要执行内部查询两次或是否有更好的方法来创建i1,并且存在i2别名?关于使用单个(强制别名)执行子查询的大量示例,但我没有看到任何“多别名”的示例。

4 个答案:

答案 0 :(得分:2)

我的倾向是以下之一:

select i1.id, i2.id
from images i1 join
     images i2
     on st_intersects(i1.footprint_latlon, i2.footprint_latlon)
where i1.id > 600 and i2.id > i1.id;

或者:

with ix as (
      select i.*
      from images i
      where i.id > 600
     )
select i1.id, i2.id
from ix AS i1 join
     ix AS i2
     on st_intersects(i1.footprint_latlon, i2.footprint_latlon)
where i2.id > i1.id;

我认为执行自我加入时没有捷径。

答案 1 :(得分:1)

我不认为有一个简洁的方法来“别名别名”。你可以这样做:

WITH 
   i1 AS (SELECT * FROM Images WHERE id > 600),
   i2 AS (SELECT * FROM i1)
SELECT i1.id, i2.id
FROM
    i1, i2
WHERE ST_INTERSECTS(i1.footprint_latlon, i2.footprint_latlon) = TRUE
AND i1.id > i2.id

修改 并且更好,正如@MatBailie所建议的那样:

WITH 
   i AS (SELECT * FROM Images WHERE id > 600)
SELECT i1.id, i2.id
FROM
    i AS i1, i AS i2
WHERE ST_INTERSECTS(i1.footprint_latlon, i2.footprint_latlon) = TRUE
AND i1.id > i2.id

答案 2 :(得分:1)

如果您不想重复(复杂)子查询,您可以使用CTE(请参阅Gordon Linoff的答案)或使用包含子查询的(temp)视图 [CTE对于优化器/规划器的行为有所不同,对于较大的结果集,这可能会导致性能不佳]:

CREATE TEMP VIEW vv AS
     -- Put your complex subquery here ...
SELECT * FROM Images WHERE id > 600
        ;

SELECT i1.id, i2.id
FROM vv i1
JOIN vv i2 ON ST_INTERSECTS(i1.footprint_latlon, i2.footprint_latlon)
AND i1.id > i2.id
        ;

答案 3 :(得分:0)

SELECT i1.id, i2.id
FROM Images i1,Images i2, 
WHERE i2.id > 600
  AND i1.id > i2.id
  AND ST_INTERSECTS(i1.footprint_latlon, i2.footprint_latlon) = TRUE