2012-09-26 11 views
9

mam 3 tabele w mojej lokalnej bazy danych PostgreSQL:Aktualizacja PostgreSQL z wewnętrznym sprzężeniem w 2 tabelach?

[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 

Na starcie będzie Znam animal_id. I trzeba uruchomić SQL do zaktualizowania animal_attribute_value_name powiązanych z tej pozycji, więc coś takiego:

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

może muszę zrobić jakąś zagnieżdżonego SELECT lub INNER JOIN wewnątrz klauzuli WHERE, ale nie wiem, jak to zrobić. Z góry dziękuję!

Edit:

Powiedzmy mam rekord animal z następujących wartości:

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

a odpowiadający animal_attrib_value (z id = 23) ma następujące wartości:

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

W czasie wykonywania mam tylko animal_id (458). Muszę wyszukać odpowiadający animal_attrib_value (23) i zmienić jego animal_attrib_value_name na 'Some new value', wszystkie wewnątrz pojedynczej instrukcji UPDATE.

+0

Jaki jest sens [] wokół identyfikatorów? – wildplasser

+0

nic, tylko tam dla atrakcyjności wizualnej; pomaga mi znacznie łatwiej zobaczyć "segmenty" (schematy, tabele, pola); domyślam się, że pożyczyłem to od moich dni MS SQL – IAmYourFaja

+0

Twoja intencja nie jest jasna. Czy chcesz zaktualizować "zwierzę", zmieniając jeden z jego atrybutów, aby (wskazywać) na nową wartość? Ponadto pomocne byłyby rzeczywiste definicje tabel. – wildplasser

Odpowiedz

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

Czy pytasz o coś takiego ...?

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) 

spróbować ..

+0

dziękuję (+1) - zobacz przykład w mojej edycji. Czy możesz potwierdzić, że powyższy kod spełnia to, czego szukam w moim przykładzie? Dzięki jeszcze raz! – IAmYourFaja