首页 > 解决方案 > PostgreSQL - 如何在多个表中找到相同的值并更新表?

问题描述

我在 PostgreSQL 中有 2 个如下表T1T2 。我想根据 T2 中的值更新 T1 中 v2 和 v3 的值。例如,T1 和 T2 共享相同的 v1 值(1 和 2),因此我想将 T2 中的 v2 和 v3 的值(a,b,c,d)传递给 T1。

T1

v1    v2    v3
1     NULL  NULL
2     NULL  NULL
3     NULL  NULL

T2

v1    v2    v3
1     a     b
2     c     d
4     e     f

期望的输出

T1

v1    v2    v3
1     a     b
2     c     d
3     NULL  NULL

这看起来很简单,但我是 SQL 新手,到目前为止我无法正确编写代码。我尝试在更新表之前先获取相同的值,但它返回错误。

SELECT *
FROM t1
WHERE
t1.v1 = t2.v1

标签: sqldatabasepostgresql

解决方案


I believe you are looking to use the UPDATE ... FROM syntax:

UPDATE t1 SET v2 = t2.v2, v3 = t2.v3 FROM t2 WHERE t1.v1=t2.v1;

Working example:

create table t1 (v1 int, v2 text, v3 text);
create table t2 (v1 int, v2 text, v3 text);
insert into t1 values (1,null,null),(2, null, null),(3, null,null);
insert into t2 values (1,'a','b'),(2,'c','d'),(4,'e','f');


postgres=# select * from t1;
 v1 | v2 | v3 
----+----+----
  1 |    | 
  2 |    | 
  3 |    | 
postgres=# UPDATE t1 SET v2 = t2.v2, v3 = t2.v3 FROM t2 WHERE t1.v1=t2.v1;
UPDATE 2
postgres=# select * from t1 order by v1;
 v1 | v2 | v3 
----+----+----
  1 | a  | b
  2 | c  | d
  3 |    | 

And BTW, the correct SELECT syntax is:

SELECT *
FROM t1, t2
WHERE
t1.v1 = t2.v1

Disclosure: I work for EnterpriseDB (EDB)


推荐阅读