首页 > 解决方案 > 有没有办法编写这段代码来避免 PostgreSQL 中来自不同表的中间步骤/视图?

问题描述

我正在处理一个大型查询,我想消除中间步骤,所以我试图在一个中编写下面的两个查询。

第一个查询(QUERY 1)从名为 tiles 的表中选择网格 id,从这里我获得了一个 UUID,它对应于第二个表中的值,因此要获得该网格 id 的实际值,我必须查询第二个查询(问题 2)。我已经尝试像在第三个查询中对其他值所做的那样强制转换所有内容,但是这种方法不起作用。有人知道我怎样才能一次性完成这个查询(查询 1 和 2):

问题 1:

SELECT
jsonb_array_elements(grid_id_tile.tiledata -> '34cfea5d-c2c0-11ea-9026-02e7594ce0a0'::text) ->> 'resourceId'::text AS grid_id
FROM mv_geojson_geoms mv
LEFT JOIN tiles grid_id_tile ON tv1.resourceinstanceid = grid_id_tile.resourceinstanceid
WHERE (( SELECT resource_instances.graphid
           FROM resource_instances
          WHERE mv.resourceinstanceid = resource_instances.resourceinstanceid)) = '34cfe98e-c2c0-11ea-9026-02e7594ce0a0'::uuid;

问题 2:

SELECT grid_id.legacyid AS grid_id,
FROM table 1 (Where I have obtained the grid id)
LEFT JOIN resource_instances grid_id ON hb1.grid_id = grid_id.resourceinstanceid::text

问题 3:

( SELECT "values".value
           FROM "values"
          WHERE ((name_ft_tile.tiledata ->> '34cfea97-c2c0-11ea-9026-02e7594ce0a0'::text)::uuid) = "values".valueid) AS nametype,

FROM mv_geojson_geoms mv

LEFT JOIN tiles name_ft_tile ON mv.resourceinstanceid = name_ft_tile.resourceinstanceid AND (name_ft_tile.tiledata ->> '34cfea97-c2c0-11ea-9026-02e7594ce0a0'::text) <> ''::text

WHERE (( SELECT resource_instances.graphid
           FROM resource_instances
          WHERE mv.resourceinstanceid = resource_instances.resourceinstanceid)) = '34cfe98e-c2c0-11ea-9026-02e7594ce0a0'::uuid

这些是我目前管理的数据类型:

这是在 jsonb 中从我想要获取 gridid 的功能中获取 UUID 的表格图块

这是 legacyid 所在的表资源实例

所以从查询 1 我得到这个结果 Gridid is a UUID

从查询 2 我得到这个结果与 grid_id 代码

这是我获得的,我想直接获得 grid_id 值而无需中间步骤

第三个查询是我在一个查询中执行的类似方法的示例,我得到的是值而不是 UUID,这就是我想要对 grid_id 执行的操作。

但是当我运行类似的代码时,我得到了错误,因为我从数组中获取元素:

错误:无法从标量上下文中提取元素:并行工作者 SQL 状态:22023

标签: postgresqlpostgresql-12

解决方案


您可以从字面上将查询 1 内联为编写“表 1(我已获得网格 ID) ”的子查询:

SELECT grid_id.legacyid AS grid_id
FROM (
   SELECT jsonb_array_elements(grid_id_tile.tiledata -> '34cfea5d-c2c0-11ea-9026-02e7594ce0a0'::text) ->> 'resourceId'::text AS grid_id
   FROM mv_geojson_geoms mv
   LEFT JOIN tiles grid_id_tile ON mv.resourceinstanceid = grid_id_tile.resourceinstanceid
   JOIN resource_instances ON mv.resourceinstanceid = resource_instances.resourceinstanceid
   WHERE resource_instances.graphid = '34cfe98e-c2c0-11ea-9026-02e7594ce0a0'::uuid;
) AS hb1
LEFT JOIN resource_instances grid_id ON hb1.grid_id = grid_id.resourceinstanceid::text;

推荐阅读