postgresql - 有没有办法编写这段代码来避免 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 的表格图块
所以从查询 1 我得到这个结果 Gridid is a UUID
这是我获得的,我想直接获得 grid_id 值而无需中间步骤
第三个查询是我在一个查询中执行的类似方法的示例,我得到的是值而不是 UUID,这就是我想要对 grid_id 执行的操作。
但是当我运行类似的代码时,我得到了错误,因为我从数组中获取元素:
错误:无法从标量上下文中提取元素:并行工作者 SQL 状态:22023
解决方案
您可以从字面上将查询 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;
推荐阅读
- javascript - Sequelize Where Not Exist 查询
- ionic-framework - 将 cordova-plugin-media 替换为 cordova-plugin-media-with-compression
- swift - xcode PhaseScriptExecution 失败,退出代码非零
- java - 用正则表达式替换字符串无法正常工作
- javascript - 在Javascript中反对相同字符串格式的字符串?
- angular - 如何使用路由器插座不附加内容而是替换
- devtools - 如何运行 pkgdown 使 YAML 生效?
- docker - 如何使用私有 docker 注册表创建 docker swarm 服务
- excel - Excel数据透视表中不同维度的不同聚合函数
- airflow - Apache Airflow - 如何在目标 DAG 中使用 TriggerDagRunOperator 设置 execution_date 以使用当前 execution_date