Sql 在postgres中的FROM子句中使用FETCH

Sql 在postgres中的FROM子句中使用FETCH,sql,postgresql,subquery,Sql,Postgresql,Subquery,所以我有一个声明: SELECT jsonb_build_object( 'type', 'Feature', 'geometry', ST_AsGeoJSON(line)::jsonb, 'properties', to_jsonb(inputs) - 'line' ) as feature from (select line, line_types from table_a) inputs

所以我有一个声明:

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) as feature from (select line, line_types from table_a) inputs;
除了FROM子句中的select语句返回了太多的行之外,它工作得很好。所以我想一次只取x行。 我在select line上声明了一个游标,line_类型来自表_a,当我从mycur中获取FORWARD 5时;它返回前5行。但是,当我尝试用fetch替换select时,它不允许我:

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) from (FETCH 1 FROM mycur) inputs;
ERROR:  syntax error at or near "FETCH"
LINE 5:         ) from (FETCH 1 FROM mycur) inputs;
                        ^
我想您不能在子查询中使用fetch?我试过了

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) as feature from (select FETCH 1 FROM mycur) inputs;
ERROR:  syntax error at or near "1"
LINE 5:         ) as feature from (select FETCH 1 FROM mycur) inputs...
                                                ^
我确实看到您可以在SELECT中仅使用FETCH语句,但这并不是我想要的:

SELECT jsonb_build_object(
            'type',       'Feature',
            'geometry',   ST_AsGeoJSON(line)::jsonb,
            'properties', to_jsonb(inputs) - 'line'
        ) as feature from (select line, line_type from table_a fetch first 10 rows only) inputs;
现在有没有办法将从游标获取作为子查询使用?

没有,在子查询中使用获取是不可能的

您应该研究如何使用键集分页:

假设表_a的主键是id

然后你从

SELECT jsonb_build_object(...) AS feature,
       id
FROM (SELECT line, line_type
      FROM table_a
      ORDER BY id
      FETCH FIRST 10 ROWS ONLY) AS inputs;
和你想的差不多

现在请记住从该查询返回的最高id;我将在下文中称之为last_id

取下下十行

SELECT jsonb_build_object(...) AS feature,
       id
FROM (SELECT line, line_type
      FROM table_a
      WHERE id > last_id
      ORDER BY id
      FETCH FIRST 10 ROWS ONLY) AS inputs;
可以根据需要重复此操作以获取更多10行的页面


该方法的优点在于它使用主键索引来提高效率。

这与执行类似“选择jsonb_构建_对象”这样的操作有什么区别吗。。。作为特征,id来自SELECT line,line_type来自表格a,其中id>first_id和id