Postgresql 更新时引用无效,那么,如何更新?

Postgresql 更新时引用无效,那么,如何更新?,postgresql,sql-update,Postgresql,Sql Update,在我的梦中,模式s的表hh的UPDATE子句如下所示: UPDATE s.hh SET x = t.a, y=t.b FROM func_ret_table('n',hh.ids) t(a, b) WHERE hh.z IS NOT NULL 但是对于PostgreSQL来说,它是一个无效的引用。。。那么,如何在不重做所有软件的情况下进行更新 函数func_ret_table只返回一行,因此不需要WHERE子句中的联接 原始错误消息: 翻译成上面的例子: ERROR: invalid ref

在我的梦中,模式s的表hh的UPDATE子句如下所示:

UPDATE s.hh
SET x = t.a, y=t.b
FROM func_ret_table('n',hh.ids) t(a, b)
WHERE hh.z IS NOT NULL
但是对于PostgreSQL来说,它是一个无效的引用。。。那么,如何在不重做所有软件的情况下进行更新

函数func_ret_table只返回一行,因此不需要WHERE子句中的联接

原始错误消息:

翻译成上面的例子:

ERROR:  invalid reference to FROM-clause entry for table "hh"
LINE 3: FROM func_ret_table('n',hh.ids) t(os...
                                  ^
TIP:  There is an entry for table "hh", but it cannot be referenced from this part of the query.
不优雅也不考虑解决方案
在我的真实案例中,我需要一个复杂的sql视图。。。我正在使用,但它是如此丑陋的解决方案。

可以使用类似行的语法在单个赋值中更新多个列:

update t set
  (x, y) = (1, 2)

等等,见:


注意:列_name[,…]=子选择语法仅在2016年使用PostgreSQL v9.5时引入。。。它还不太为人所知,但却非常有用

请编辑您的问题,并添加您收到的确切错误消息Hanks@a_horse_with_no_name,我编辑过。错误消息与您显示的SQL不匹配,但问题显然是,您不能在UPDATE语句中使用横向联接。@a_horse_with_no_name,我编辑过,现在将其转换为上述示例,简单的解决方法可能是:更新s.hh set x,y=从func_ret_table'n',hh.ids中选择a,b,其中hh.z不为null;但显然这并不是问题的答案。
CREATE VIEW vw_ab_update AS 
  SELECT w.id, t.a, t.b 
  FROM s.hh, LATERAL func_ret_table('n',hh.ids) t(a, b) 
  WHERE hh.z IS NOT NULL
;
UPDATE s.hh
SET x = t.a, y=t.b
FROM vw_ab_update t
WHERE hh.id=t.id
;
update t set
  (x, y) = (1, 2)
update t set
  (x, y) = (select 1, 2)
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
    SET { column_name = { expression | DEFAULT } |
          ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
          ( column_name [, ...] ) = ( sub-SELECT )
        } [, ...]
    [ FROM from_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
UPDATE s.hh
SET (x, y) = (SELECT a, b FROM func_ret_table('n',hh.ids) t(a, b))
WHERE hh.z IS NOT NULL