修改
根据要求,我想要实现的目标。我有一个我想查询的表,但我不想更改表本身。接下来需要清除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的新手,所以我完全有可能使用错误的方法。
答案 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