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.*