1

今天早上我问了这个非常相似的问题,得到了很好的回答。

但是,看完剧本后,我发现我的实际问题我在那个问题中描述的要复杂一些。基本上,我有 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

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

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

并且对应的animal_attrib_type(id = 38)具有以下值:

[myschema].[animal_attrib_types]
--------------------------------
animal_attrib_type_id = 38
animal_attrib_type_name = 'animals.should-make-noise'

并且对应的animal_attrib_value(id = 23)具有以下值:

[myschema].[animal_attrib_values]
--------------------------------
animal_attrib_type_id = 23
animal_attrib_type_name = 'true'

因此,同animal一条记录可以有多个类型/值对。在这种情况下,动物有一个对应于一个animal_attrib_type_name“ ”的“ ”。animals.should-make-noiseanimal_attrib_value_nametrue

在运行时,我将只有animal_id(ie, 458) 和animal_attrib_type_id(ie, 38)。我需要能够查找animal_attrib_value_name与给定animal_idanimal_attrib_type_id仅对应的适当值,然后将其值更新为一些静态文本(“真”或“假”);全部来自同一个 UPDATE 语句。

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

4

2 回答 2

7

使用FROMPostgreSQLUPDATE命令中的子句。这通常更清洁、更快。

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;

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

此外,不要SETUPDATE. 那是语法错误。我在所述页面上引用手册:

不要在目标列的规范中包含表的名称——例如,UPDATE tab SET tab.col = 1无效的。

大胆强调我的。

于 2012-09-26T18:50:52.183 回答
1

下面的 SQL 应该可以满足您的要求:

UPDATE animal_attrib_values aav
SET animal_attrib_value_name= 'true'
WHERE aav.animal_attrib_value_id = (
    SELECT a.animal_attrib_value_id 
    FROM animals a 
    WHERE a.animal_id = 458 
        AND a.animal_attrib_type_id  = 38
)
;
于 2012-09-26T13:24:52.993 回答