Postgres 使用跨 2 个表的内部连接进行更新?

Posted

技术标签:

【中文标题】Postgres 使用跨 2 个表的内部连接进行更新?【英文标题】:Postgres update with an inner join across 2 tables? 【发布时间】:2012-09-18 00:18:29 【问题描述】:

我的本​​地 Postgres 数据库中有 3 个表:

[myschema].[animals]
--------------------
animal_id
animal_attrib_type_id (foreign key to [myschema].[animal_attrib_types])
animal_attrib_value_id (foreign key to [myschema].[animal_attrib_values])

[myschema].[animal_attrib_types]
--------------------------------
animal_attrib_type_id
animal_attrib_type_name

[myschema].[animal_attrib_values]
--------------------------------
animal_attrib_value_id
animal_attrib_value_name

在运行时我会知道animal_id。我需要运行 SQL 来更新与此项目关联的 animal_attribute_value_name,所以类似于:

UPDATE
    animal_attribute_values aav
SET
    aav.animal_attribute_value_name = 'Some new value'
WHERE
    # Somehow join from the provided animal_id???

我可能需要在WHERE 子句中执行某种嵌套的SELECTINNER JOIN,但不确定如何执行此操作。提前致谢!

编辑

假设我有一个具有以下值的 animal 记录:

[myschema].[animals]
--------------------
animal_id = 458
animal_attrib_type_id = 38
animal_attrib_value_id = 23

而对应的animal_attrib_value(id = 23)有以下值:

[myschema].[animal_attrib_values]
--------------------------------
animal_attrib_value_id = 23
animal_attrib_value_name = 'I am some value that needs to be changed.'

在运行时,我只有animal_id (458)。我需要查找相应的animal_attrib_value (23) 并将其animal_attrib_value_name 更改为'Some new value',所有这些都在单个UPDATE 语句中。

【问题讨论】:

标识符周围的[]是什么意思? 没什么,只是为了视觉吸引力;帮助我更轻松地查看“段”(模式、表格、字段);我猜我是从我的 MS SQL 时代借来的 你的意图不明确。您想更新“动物”,将其属性之一更改为(指向)新值吗?另外:实际的表定义会有所帮助。 “一些新值”来自任何表或静态表..? 抱歉造成混淆 - 在运行时我会知道我想更新其对应的 animal_attrib_value 的动物。请注意,在animals 表上,我有一个指向animal_attrib_values 的外键。这个外键不应该改变,只有对应的animal_attrib_value_name 【参考方案1】:
UPDATE
    animal_attribute_values aav
SET
    animal_attribute_value_name = 'Some new value'
FROM animals aa
WHERE aa.animal_id = 458
AND aa.animal_attrib_value_id = aav.animal_attrib_value_id
  ;

【讨论】:

【参考方案2】:

你问这样的问题对吗..?

update  animal_attribute_values aav
set  aav.animal_attribute_value_name = 'Some new value'
where aav.animal_attrib_value_id in (
select a.animal_attrib_value_id where a.animal_id=458)

试试这个..

【讨论】:

感谢 (+1) - 请参阅我编辑中的示例。你能确认你上面的代码完成了我在我的例子中寻找的东西吗?再次感谢!

以上是关于Postgres 使用跨 2 个表的内部连接进行更新?的主要内容,如果未能解决你的问题,请参考以下文章

跨 3 个表的 MySQL 外键“ON DELETE CASCADE”

跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行

用于 4 个表的 SQL Server 2008 连接类型

Postgres:缺少表的 FROM 子句条目

计算来自多个表的连接数

跨 3 个表的多个记录的特定字符串的顺序查找并按最新条目显示