你能一起运行UPDATE和WITH吗?

时间:2016-01-16 00:41:55

标签: sql postgresql

我正在尝试对表运行更新,但收到错误

ERROR:  syntax error at or near "UPDATE"

查询是:

WITH
  first_users AS (
    select min(created_at) as first_at,
    company_id as company_id
    from users
    group by company_id
  )

UPDATE companies
 SET first_seen_at = LEAST(first_seen_at,
    (SELECT first_at FROM first_users WHERE id = first_users.company_id)
 );

你能不能一起运行UPDATE和WITHs吗?看起来很奇怪。

我的查询实际上稍微复杂一点,这就是我使用with语法的原因。当我运行SELECT * FROM first_users而不是UPDATE时,它可以工作,所以UPDATE关键字有什么问题。

2 个答案:

答案 0 :(得分:1)

我建议在任何情况下将此更改为update . . . from。没有理由更新不匹配的记录。所以:

update companies
   set first_seen_at = u.first_at
   from (select company_id, min(created_at) as first_at
         from users
         group by company_id
        ) u
   where companies.id = u.company_id and
         u.first_seen_at < companies.first_seen_at;

Postgres开始支持CTE版本9.1(http://www.postgresql.org/docs/9.1/static/sql-update.html vs http://www.postgresql.org/docs/9.0/static/sql-update.html)的更新。此方法更好,因为它在更新之前过滤行。

答案 1 :(得分:-3)

尝试封装查询qith BEGIN / END。我不知道PostgreSql,但MsSql不接受WITH而没有BEGIN / END ...