2012-09-26 9 views
9

Ich habe 3 Tabellen in meinem lokalen Postgres-Datenbank:Postgres Update mit einem inneren Join über 2 Tabellen?

[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 

Zur Laufzeit werde ich die animal_id kennen. Ich brauche SQL ausführen, um die animal_attribute_value_name diesem Element zugeordnet zu aktualisieren, so etwas wie:

UPDATE 
    animal_attribute_values aav 
SET 
    aav.animal_attribute_value_name = 'Some new value' 
WHERE 
    # Somehow join from the provided animal_id??? 

ich haben eine Art von verschachtelten SELECT oder INNER JOIN innerhalb der WHERE Klausel zu tun, aber nicht sicher, wie dies zu tun. Danke im Voraus!

bearbeiten:

Sagen wir, ich habe eine animal Datensatz mit den folgenden Werten:

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

und die entsprechenden animal_attrib_value (mit id = 23) hat die folgenden Werte:

[myschema].[animal_attrib_values] 
-------------------------------- 
animal_attrib_value_id = 23 
animal_attrib_value_name = 'I am some value that needs to be changed.' 

Zur Laufzeit habe ich nur die animal_id (458). Ich muss die entsprechende animal_attrib_value (23) nachschlagen und ihre animal_attrib_value_name zu 'Some new value', alle innerhalb einer einzigen UPDATE-Anweisung ändern.

+0

Was ist die Bedeutung der [] um die Kennungen? – wildplasser

+0

nichts, nur für visuelle Attraktivität; hilft mir, "Segmente" (Schemas, Tabellen, Felder) viel einfacher zu sehen; Ich glaube, ich habe es von meinen MS SQL-Tagen geliehen – IAmYourFaja

+0

Ihre Absicht ist nicht klar. Möchten Sie ein "Tier" aktualisieren, indem Sie eines seiner Attribute ändern (auf einen neuen Wert zeigen)? Außerdem: tatsächliche Tabellendefinitionen würden helfen. – wildplasser

Antwort

27
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 
    ; 
4

Fragen Sie so etwas richtig ..?

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) 

dies versuchen ..

+0

danke (+1) - bitte sehen Sie das Beispiel in meiner Bearbeitung. Können Sie bestätigen, dass Ihr Code oben in meinem Beispiel das erreicht, wonach ich suche? Danke noch einmal! – IAmYourFaja