更新中间结果

时间:2015-05-30 08:41:02

标签: postgresql

修改 根据要求,我想要实现的目标。我有一个我想查询的表,但我不想更改表本身。接下来需要清除SELECT查询(我称之为'中间表')的结果。例如,某些行的某些单元格需要交换,并且需要修剪某些字符串。当然,这可以在例如Python中作为后处理完成,但我希望用一个查询语句来完成所有这些。

对Postgresql不熟悉我想更新由SELECT语句产生的中间表。所以我基本上想在一个查询中从SELECT语句编辑结果表。我想防止必须存储中间结果。

我尝试过以下'with clause':

with result as (
    select
        a
    from
        b
)
update result as r
set
    a = 'd'

...但这会产生ERROR: relation "result" does not exist,而以下情况有效:

with result as (
    select
        a
    from
        b
)
select
    *
from
    result

正如我所说,我是Postgresql的新手,所以我完全有可能使用错误的方法。

1 个答案:

答案 0 :(得分:1)

根据您要执行的转换的复杂程度,您可以将其移植到SELECT,这样您就可以使用单个查询:

WITH foo AS (SELECT lower(name), freq, cumfreq, rank, vec FROM names WHERE name LIKE 'G%')
SELECT ... FROM foo WHERE ...

或者,对于或多或少的无限制操作选项,您可以创建一个临时表,该表将在当前事务结束时消失。这并没有在单个查询中完成工作,但它确实在SQL服务器上完成了所有工作,这可能仍然值得。

db=# BEGIN;
BEGIN
db=# CREATE TEMP TABLE foo ON COMMIT DROP AS SELECT * FROM names WHERE name LIKE 'G%';
SELECT 4677
db=# SELECT * FROM foo LIMIT 5;
   name   | freq  | cumfreq | rank |          vec
----------+-------+---------+------+-----------------------
 GREEN    | 0.183 |  11.403 |   35 | 'KRN':1 'green':1
 GONZALEZ | 0.166 |  11.915 |   38 | 'KNSL':1 'gonzalez':1
 GRAY     | 0.106 |  15.921 |   69 | 'KR':1 'gray':1
 GONZALES | 0.087 |  18.318 |   94 | 'KNSL':1 'gonzales':1
 GRIFFIN  | 0.084 |  18.659 |   98 | 'KRFN':1 'griffin':1
(5 rows)

db=# UPDATE foo SET name = lower(name);
UPDATE 4677
db=# SELECT * FROM foo LIMIT 5;
  name  | freq  | cumfreq | rank  |         vec
--------+-------+---------+-------+---------------------
 grube  | 0.002 |  67.691 |  7333 | 'KRP':1 'grube':1
 gasper | 0.001 |  69.999 |  9027 | 'KSPR':1 'gasper':1
 gori   | 0.000 |  81.360 | 28946 | 'KR':1 'gori':1
 goeltz | 0.000 |  85.471 | 47269 | 'KLTS':1 'goeltz':1
 gani   | 0.000 |  86.202 | 51743 | 'KN':1 'gani':1
(5 rows)

db=# COMMIT;
COMMIT
db=# SELECT * FROM foo;
ERROR:  relation "foo" does not exist