SQL 子查询中有多个别名
SQL multiple alias in subquery
我有一个设置,我想在空间查询中支持用户定义的子查询以识别重叠的多边形。下面是一个例子:
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
上面的方法有效,但我有更规范的方法来做到这一点。
内部查询在这里完全是任意的,重要的是我使用相同的查询定义 i1
和 i2
。我这样做是为了让外部空间查询具有 i1
和 i2
别名。
是否需要执行两次内部查询或是否有更好的方法来创建 i1
,并且存在 i2
别名?关于使用单个(强制别名)执行子查询的很多示例,但我没有看到 'multi-aliases'.
的任何示例
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
我认为 "alias an alias" 没有简单明了的方法。你可以这样做:
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
我的倾向是以下之一:
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;
我认为执行自联接没有捷径。
如果您不想重复(复杂的)子查询,您可以使用 CTE(参见 Gordon Linoff 的回答)或使用包含子查询的(临时)视图
[对于 optimiser/planner,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
;
我有一个设置,我想在空间查询中支持用户定义的子查询以识别重叠的多边形。下面是一个例子:
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
上面的方法有效,但我有更规范的方法来做到这一点。
内部查询在这里完全是任意的,重要的是我使用相同的查询定义 i1
和 i2
。我这样做是为了让外部空间查询具有 i1
和 i2
别名。
是否需要执行两次内部查询或是否有更好的方法来创建 i1
,并且存在 i2
别名?关于使用单个(强制别名)执行子查询的很多示例,但我没有看到 'multi-aliases'.
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
我认为 "alias an alias" 没有简单明了的方法。你可以这样做:
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
我的倾向是以下之一:
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;
我认为执行自联接没有捷径。
如果您不想重复(复杂的)子查询,您可以使用 CTE(参见 Gordon Linoff 的回答)或使用包含子查询的(临时)视图 [对于 optimiser/planner,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
;