Sql 在“无需合并”和“空”之间。实际的模式相当大,我将推断出更具体的内容,并将其放入要点中。版本方面-我很乐意运行任何需要的版本来实现这一点。目前是9.1,但无论如何都计划升级到9.4。这就是我目前的情况,包括第一个答案中的建议。谢谢。使用“distinct”

Sql 在“无需合并”和“空”之间。实际的模式相当大,我将推断出更具体的内容,并将其放入要点中。版本方面-我很乐意运行任何需要的版本来实现这一点。目前是9.1,但无论如何都计划升级到9.4。这就是我目前的情况,包括第一个答案中的建议。谢谢。使用“distinct”,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,在“无需合并”和“空”之间。实际的模式相当大,我将推断出更具体的内容,并将其放入要点中。版本方面-我很乐意运行任何需要的版本来实现这一点。目前是9.1,但无论如何都计划升级到9.4。这就是我目前的情况,包括第一个答案中的建议。谢谢。使用“distinct”是否比使用“!=”更好作为一个运营商,或者他们本质上是一样的?我不喜欢数组的概念-这只是我第一次能够区分空字段和不需要合并的字段。@JamesDavies:空处理是不同的,在继续之前理解差异是很重要的。旁白:标准的SQL不等式操作是。Postg


在“无需合并”和“空”之间。实际的模式相当大,我将推断出更具体的内容,并将其放入要点中。版本方面-我很乐意运行任何需要的版本来实现这一点。目前是9.1,但无论如何都计划升级到9.4。这就是我目前的情况,包括第一个答案中的建议。谢谢。使用“distinct”是否比使用“!=”更好作为一个运营商,或者他们本质上是一样的?我不喜欢数组的概念-这只是我第一次能够区分空字段和不需要合并的字段。@JamesDavies:空处理是不同的,在继续之前理解差异是很重要的。旁白:标准的SQL不等式操作是
。Postgres也接受
=,但最好使用标准。
UPDATE accounts
SET status = merge_accounts.status,
    field1 = merge_accounts.field1,
    field2 = merge_accounts.field2,
    etc.
FROM merge_accounts WHERE merge_accounts.uid =accounts.uid
RETURNING accounts.*
UPDATE accounts
SET x=..., y=...
FROM accounts as old WHERE old.uid = accounts.uid
FROM merge_accounts WHERE merge_accounts.uid = accounts.uid
RETURNING accounts, old
create table foo
(
  id serial,
  val integer,
  name text
);

insert into foo (val, name) VALUES (10, 'foo'), (20, 'bar'), (30, 'baz');
select column_name
from information_schema.columns
where table_name = 'foo'
order by ordinal_position;
SELECT * FROM old;
 id | val 
----+-----
  1 |   1
  2 |   2
  4 |   5
  5 |   1
  6 |   2

SELECT * FROM new;
 id | val 
----+-----
  1 |   2
  2 |   2
  3 |   2
  5 |   1
  6 |   1

SELECT * FROM old JOIN new ON old.id = new.id;
 id | val | id | val 
----+-----+----+-----
  1 |   1 |  1 |   2
  2 |   2 |  2 |   2
  5 |   1 |  5 |   1
  6 |   2 |  6 |   1
(4 rows)

 WITH sel AS (
               SELECT o.id , o.val  FROM old o JOIN new n ON o.id=n.id  ),
 upd AS (
              UPDATE old  SET val = new.val  FROM new WHERE new.id=old.id RETURNING old.*  )
 SELECT * from sel, upd WHERE sel.id = upd.id AND sel.val <> upd.val;
 id | val | id | val 
----+-----+----+-----
  1 |   1 |  1 |   2
  6 |   2 |  6 |   1
(2 rows)
UPDATE accounts
SET status = merge_accounts.status,
    field1 = merge_accounts.field1,
    field2 = merge_accounts.field2,
    etc.
FROM merge_accounts WHERE merge_accounts.uid =accounts.uid
 AND NOT (status IS NOT DISTINCT FROM merge_accounts.status 
      AND field1 IS NOT DISTINCT FROM merge_accounts.field1 
      AND field2 IS NOT DISTINCT FROM merge_accounts.field2
      )
RETURNING accounts.* 
UPDATE accounts a
SET   (status,   field1,   field2)  -- short syntax for  ..
  = (m.status, m.field1, m.field2)  -- .. updating multiple columns
FROM   merge_accounts m
WHERE  m.uid = a.uid
AND   (a.status IS DISTINCT FROM m.status OR
      a.field1 IS DISTINCT FROM m.field1 OR 
      a.field2 IS DISTINCT FROM m.field2)
RETURNING a.*;
UPDATE accounts a
SET   (status,   field1,   field2)
  = (m.status, m.field1, m.field2)
FROM   merge_accounts m
WHERE  a.uid = m.uid
AND   m IS DISTINCT FROM a
RETURNING a.*;
UPDATE accounts a
SET   (status, field1, field2)
   = (COALESCE(m.status[1], a.status)  -- default to original ..
   , COALESCE(m.field1[1], a.field1)   -- .. if m.column[1] IS NULL
   , COALESCE(m.field2[1], a.field2))
FROM   merge_accounts m
WHERE  m.uid = a.uid
AND  (m.status[1] IS NOT NULL AND a.status IS DISTINCT FROM m.status[1]
   OR m.field1[1] IS NOT NULL AND a.field1 IS DISTINCT FROM m.field1[1]
   OR m.field2[1] IS NOT NULL AND a.field2 IS DISTINCT FROM m.field2[1])
RETURNING a.*