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
子句中执行某种嵌套的SELECT
或INNER 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”