【问题标题】:Using FETCH inside a FROM clause in postgres在 postgres 的 FROM 子句中使用 FETCH
【发布时间】:2021-03-13 03:36:29
【问题描述】:

所以我有一个声明:

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 语句返回了太多行之外,它工作得很好。所以我只想 FETCH 一次只做 x 行。 我在 table_a 中的选择行 line_types 上声明了一个游标,当我执行 FETCH FORWARD 5 FROM mycur;它返回了前 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;

现在有办法使用 FETCH FROM Cursor 作为子查询吗?

【问题讨论】:

    标签: sql postgresql subquery


    【解决方案1】:

    不,不能在子查询中使用FETCH

    你应该考虑使用 keyset 分页

    假设table_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 行的页面。

    该方法的美妙之处在于它使用主键索引以提高效率。

    【讨论】:

    • 这和做类似的事情有什么区别:``` SELECT jsonb_build_object(...) AS feature, id FROM (SELECT line, line_type FROM table_a WHERE id > first_id and id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多