【问题标题】:how to convert CTE to nested SELECT如何将 CTE 转换为嵌套 SELECT
【发布时间】:2021-12-29 05:09:41
【问题描述】:

我有以下发布的查询。我想使用嵌套的SELECT 语句而不是CTE。我想让外部 SELECT 声明说明表 grid_cell_data 中包含的列 我不想使用j.* 我想改用列名

查询:

WITH j AS (
 SELECT
   ST_AsMVTGeom(
     st_geomfromtext(geometryofcellrepresentativetobuffer),
     ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096,4096)))
 FROM grid_cell_data where id = 3
)
SELECT ST_AsMVT(j.*) FROM j

grid_cell_data 表

CREATE TABLE IF NOT EXISTS grid_cell_data (
   id SERIAL PRIMARY KEY,
   isTreatment boolean,
   isBuffer boolean,
   geometryOfCellRepresentativeToTreatment geometry,
   geometryOfCellRepresentativeToBuffer geometry 
)

【问题讨论】:

  • 问题是什么?为什么不能将 CTE 移动到 subselect ?只需将 j AS (....) 从 CTE 复制到 FROM 部分,例如 (...) as j 代替 j。似乎直截了当。

标签: sql postgresql postgis common-table-expression


【解决方案1】:

您只需要在 CTE/子查询中选择您需要的所有记录,在外部查询中您可以继续使用 j 或 j.*。如果您需要进一步选择特定列,请将它们放在SELECT 中的括号之间,以便它代表ST_AsMVT 的记录,例如

WITH j AS (
 SELECT *,
   ST_AsMVTGeom(
     st_geomfromtext(geometryofcellrepresentativetobuffer),
     ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096,4096))) AS mvt_geom
 FROM grid_cell_data where id = 3
)
SELECT ST_AsMVT((id,isTreatment,isBuffer,mvt_geom)) 
FROM j  

【讨论】:

  • 你能告诉我为什么我们需要 (( 和 )) 用于 st_asmvt 吗?我知道它需要一行而不是单独的参数.. postgresql 是如何将参数转换为行的?
  • 是否可以将第一个 * 也替换为我感兴趣的列?
  • @LetsamrIt 第一个问题:括号之间用逗号分隔的列表示record,这是函数所期望的。第二个问题:是的,有可能。你可以通过两种方式做到这一点
  • 你的意思是像 (( )) 这样的双括号之间而不是单括号之间,我是吗?
  • @LetsamrIt 内括号属于记录,外括号属于函数本身
猜你喜欢
  • 2017-08-24
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2012-08-11
  • 2015-06-06
  • 2021-10-21
相关资源
最近更新 更多