簡體   English   中英

子查詢中的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

上面的工作,但我更規范的方式存在。

內部查詢在這里是完全任意的,重要的組成部分是我使用相同的查詢來定義i1i2 我這樣做是為了對外部空間查詢使用i1i2別名。

是否需要兩次執行內部查詢,還是有更好的方法來創建i1i2別名? 關於使用單個(強制別名)執行子查詢的很多示例,但是我看不到“多重別名”的任何示例。

我認為沒有簡單的“別名別名”方法。 您可以執行以下操作:

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的答案),也可以使用包含子查詢的(臨時)視圖[對於較大的結果集,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 Images i1,Images i2, 
WHERE i2.id > 600
  AND i1.id > i2.id
  AND ST_INTERSECTS(i1.footprint_latlon, i2.footprint_latlon) = TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM