【问题标题】:PostgreSQL return select results AND add them to temporary table?PostgreSQL返回选择结果并将它们添加到临时表中?
【发布时间】:2014-10-24 00:57:34
【问题描述】:

我想选择一组行并将它们返回给客户端,但我也想只将结果集中的主键(整数 id)插入到临时表中,以供以后在同一事务中的联接中使用.

这是为了同步,其中后续查询往往涉及对先前查询结果的联接。

最有效的方法是什么?

我不愿执行两次查询,但如果将其添加到查询缓存中可能会很快。另一种方法是将整个结果集存储到临时表中,然后从临时表中选择。这似乎也很浪费(我只需要临时表中的整数 id。)如果有一个 SELECT INTO TEMP 也返回结果,我会很高兴。

目前使用的技术是在客户端构造一个整数 id 的数组,并在随后的 IN 查询中使用它。我希望有更有效的东西。

我猜它可以用存储过程来完成?但是有没有办法没有呢?

【问题讨论】:

    标签: sql postgresql common-table-expression temp-tables


    【解决方案1】:

    我认为您可以使用 Postgres 功能来做到这一点,该功能允许在 CTE 中执行数据修改步骤。使用此功能的更典型原因是,例如,删除表的记录,然后将它们插入日志表。但是,它可以适应这个目的。这是一种可能的方法(我手头没有 Postgres 来测试它):

    with q as (
          <your query here>
         ),
         t as (
          insert into temptable(pk)
              select pk
              from q
         )
    select *
    from q;
    

    通常,您将returning 子句与数据修改查询一起使用,以捕获正在修改的数据。

    【讨论】:

    • 有趣,我会试试这些。使用第二种格式,是否有理由将整个内容包装在“with”中? “insert into temp select * from ...返回*”不应该自己工作吗?
    • @Eloff 。 . .是的。我只是更喜欢让select 语句返回数据,update/delete/insert 像在其他数据库中一样修改数据。
    • 第一个(更便宜的)查询应该确实有效。 Data-modifying statements in WITH are executed exactly once, and always to completion. 详情:stackoverflow.com/questions/15809463/…
    • @ErwinBrandstetter 。 . .我担心with 中的q 是否在insert 的正确范围内。
    • 相互引用的 CTE 会自动按顺序执行(而执行顺序是任意的,没有交叉引用)。所以,是的,能见度很有效。我以前用过这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2020-01-18
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多