【问题标题】:Postgres update with an inner join across 2 tables?Postgres 使用跨 2 个表的内部连接进行更新?
【发布时间】: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

标签: sql postgresql sql-update inner-join rdbms


【解决方案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) - 请参阅我编辑中的示例。你能确认你上面的代码完成了我在我的例子中寻找的东西吗?再次感谢!
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    相关资源
    最近更新 更多