2012-09-26 66 views
1

今天早上我問了一個非常相似的問題,它的回答很精美。Postgres通過3個表的內部聯接進行更新?

但是,在回顧了這個劇本之後,我發現我的實際問題是稍微比我在那個問題中描述的要複雜得多。基本上,我有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記錄可以有多個類型/值對。在這種情況下,動物具有對應於「true」的animal_attrib_value_name的「animals.should-make-noise」的animal_attrib_type_name

在運行時,我將只有animal_id(即458)和animal_attrib_type_id(即38)。我需要能夠查找相應的animal_attrib_value_name,僅對應於給定的animal_idanimal_attrib_type_id,然後將其值更新爲某些靜態文本('true'或'false');全部來自相同的UPDATE語句。

上面提到的問題的答案對我提到的問題是正確的,但由於同一個動物具有0+類型/值組合,我實際上需要一個稍微不同的SQL語句。提前致謝!

+0

可能重複[Postgres更新與跨表內部連接?](http://stackoverflow.com/questions/12600608/postgres-update-with-an-inner-join-across-2-tables) –

+0

@Clodoaldo - 請實際閱讀我的問題!我在上面的第一句中提到了這個問題!我故意引用它。它也不是重複的!兩個不同的問題! – IAmYourFaja

+0

任何將此關閉爲「完全重複」的人顯然不會讀這個問題的第一句話!也沒有看到這個鏈接問題的列表! – IAmYourFaja

回答

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 
) 
; 
7

利用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

不要在目標 柱的規格包括表的名稱 - 例如,UPDATE tab SET tab.col = 1無效

大膽重視我的。