sql - PostgreSQL - 如何在多个表中找到相同的值并更新表?
问题描述
我在 PostgreSQL 中有 2 个如下表T1和T2 。我想根据 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
解决方案
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)
推荐阅读
- javascript - 如何使用 Material-UI Autocomplete 组件选择多个选项并添加新选项?
- ms-word - 您可以根据 MS Word 中另一个单元格的内容为一个单元格着色吗?
- logging - 是否可以在 GLib 新结构化日志记录中为每个域/日志级别设置不同的写入器函数?
- javascript - 如何以随机顺序运行一组函数
- php - 与 SQL Server 连接的 PHP 登录表单不起作用
- javascript - 我的页面上未应用比例属性(anime.js)
- c# - 无法将 IApplicationDbContext 注入 .net 核心中的服务类
- javascript - 从 JavaScript/TypeScript 中的字符串获取特定数据(用于创建表的 SQL 脚本)
- javascript - Discord.js 错误 - MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏
- python - 如何在相互映射时循环打印多个列表?