基于另一个表的 SQL 更新

Posted

技术标签:

【中文标题】基于另一个表的 SQL 更新【英文标题】:SQL update based off another table 【发布时间】:2018-03-29 08:37:57 【问题描述】:

我已经浏览了几篇帖子,但无法理解如何在 PostgreSQL 中实现以下目标

Table 1
---------

USER_ID    NAME
1          User
2          Test

Table 2
--------

USER_ID    WIDGET_ID   WIDGET_CONFIG
1              1             abc
1              2             def
2              1             abc
2              2             def

我有两张桌子,我需要的是

从表 1 中选择,其中用户名 = "Test" 使用该 ID (2) 选择 USER_ID 为 2 且 WIDGET_ID 为 2 的小部件 例如将 widget_config 更新为“ghi”

我一直在使用 WITH 语句让自己陷入困境,也许是完全错误的方式

WITH res AS ( 
    SELECT agent_id FROM tbl_agent WHERE agentlogin_id='2man'
)

SELECT tbl_agentwidgetconfig
WHERE agent_id=res.agent_id AND widget_id=5;

// Update record code?

如果有人能阐明执行此操作的正确方法,将不胜感激!

【问题讨论】:

POSTGRESQL 和 mysql 不一样 为什么你都标记了? 同时指定预期结果。 一个简单的 JOIN 可能就是你想要的。 @jarlh 结果只是指定记录的更新,示例会很有帮助 所以你有 两个 表。我数了三个,有 五个 不同的名称:table1,table2, tbl_agent, widget_config,tbl_agentwidgetconfig 【参考方案1】:

类似的东西

UPDATE tbl_agentwidgetconfig 
SET widget_config='hij'
WHERE agent_id=any(
  SELECT agent_id FROM tbl_agent
  WHERE agent_loginid='2man')
AND widget_id=5;

【讨论】:

【参考方案2】:

我认为你在描述这样的事情?

UPDATE
    aw
SET
    WIDGET_CONFIG = 'ghi'
FROM
    tbl_agent a
    INNER JOIN tbl_agentwidgetconfig aw ON aw.USER_ID = a.USER_ID
WHERE
    a.NAME = 'Test'
    AND aw.WIDGET_ID = 2;

【讨论】:

这对 Postgres 无效【参考方案3】:

您也可以通过子查询来做到这一点:

UPDATE table2 
SET WIDGET_CONFIG = 'ghi'
WHERE WIDGET_ID = 2 AND USER ID = (SELECT USER_ID FROM table1 WHERE NAME = 'Test');

【讨论】:

以上是关于基于另一个表的 SQL 更新的主要内容,如果未能解决你的问题,请参考以下文章

更新一个表的字段值等于另一个表的字段值的SQL语句

在 SQL 中从另一个表更新一个表的最佳方法是啥?

更新一个表的字段值等于另一个表的字段值的SQL语句要怎么写?

SQL /peewee。如何根据另一个表的条件更新记录?

sql怎样把一个表的数据更新到另一个表

SQL查询语法错误,使用另一个表的数据更新表[重复]