Postgres更新了3个表的内连接?

IAm*_*aja 1 sql postgresql inner-join sql-update

今天早上我问了这个非常相似的问题,答案很精彩.

然而,查阅播放后,我看到我实际的问题是稍微复杂得多,我在这个问题描述.基本上,我有3个Postgres表:

[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
Run Code Online (Sandbox Code Playgroud)

所以,我可能会有这样的animal记录:

[myschema].[animals]
--------------------
animal_id = 458
animal_attrib_type_id = 38
animal_attrib_value_id = 23
Run Code Online (Sandbox Code Playgroud)

相应的animal_attrib_type(id = 38)具有以下值:

[myschema].[animal_attrib_types]
--------------------------------
animal_attrib_type_id = 38
animal_attrib_type_name = 'animals.should-make-noise'
Run Code Online (Sandbox Code Playgroud)

相应的animal_attrib_value(id = 23)具有以下值:

[myschema].[animal_attrib_values]
--------------------------------
animal_attrib_type_id = 23
animal_attrib_type_name = 'true'
Run Code Online (Sandbox Code Playgroud)

因此,相同的animal记录可以具有多个类型/值对.在这种情况下,动物有一个animal_attrib_type_name"的animals.should-make-noise"对应于animal_attrib_value_name的" true".

在运行时,我将只有animal_id(即458)和animal_attrib_type_id(即38).我需要能够查找合适的animal_attrib_value_name对应于给定animal_idanimal_attrib_type_id它的价值只,然后更新到一些静态文本("真"或"假"); 所有这些都来自同一个UPDATE语句.

上面提到的问题的答案对于我说的问题是正确的,但由于同一个动物有0 +类型/值组合,我实际上需要一个稍微不同的SQL语句.提前致谢!

Erw*_*ter 7

使用FROMPostgreSQL UPDATE命令中的子句.这通常更干净,更快.

UPDATE animal_attrib_values av
SET    animal_attrib_value_name = 'true'
FROM   animals a 
WHERE  a.animal_id = 458 
AND    a.animal_attrib_type_id  = 38
AND    a.animal_attrib_value_id = av.animal_attrib_value_id;
Run Code Online (Sandbox Code Playgroud)

因为我们已经知道animal_attrib_type_id我们根本不需要包括第三个表格animal_attrib_types.如果需要,我们可以另外加入...

另外,不要对表格中的SET项目进行限定UPDATE.这是一个语法错误.我在上述页面引用手册:

不要在目标列的规格包括表的名称-例如,UPDATE tab SET tab.col = 1无效的.

大胆强调我的.