gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:29:32 25 4
gpt4 key购买 nike

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

然而,在回顾剧本之后,我发现我的实际问题比我在那个问题中描述的稍微复杂。基本上,我有 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-noise”,对应于 animal_attrib_value_name 为“true”。

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

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

最佳答案

利用 FROM clause in the PostgreSQL UPDATE command .这通常更干净、更快。

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。如果需要,我们可以另外加入...

此外,不要对 UPDATE 中的 SET 项进行表限定。那是一个语法错误。我引用 manual on said page :

Do not include the table's name in the specification of a target column — for example, UPDATE tab SET tab.col = 1 is invalid.

大胆强调我的。

关于sql - Postgres 使用跨 3 个表的内部连接进行更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com