2012-09-26 33 views
9

Tôi có 3 bảng trong cơ sở dữ liệu Postgres địa phương của tôi:Cập nhật Postgres với tham gia bên trong qua 2 bảng?

[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 

Khi chạy tôi sẽ biết animal_id. Tôi cần phải chạy SQL để cập nhật các animal_attribute_value_name liên quan đến mặt hàng này, vì vậy cái gì đó như:

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

tôi có thể phải làm một số loại lồng nhau SELECT hoặc INNER JOIN bên trong mệnh đề WHERE, nhưng không chắc chắn làm thế nào để làm điều này. Cảm ơn trước!

Sửa:

Hãy nói rằng tôi có một kỷ lục animal với các giá trị sau:

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

Và tương ứng animal_attrib_value (với id = 23) có các giá trị sau:

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

Khi chạy, tôi chỉ có animal_id (458). Tôi cần tra cứu số animal_attrib_value (23) tương ứng và thay đổi animal_attrib_value_name thành 'Some new value', tất cả bên trong một câu lệnh UPDATE duy nhất.

+0

ý nghĩa của [] xung quanh định danh là gì? – wildplasser

+0

không có gì, chỉ có để thu hút thị giác; giúp tôi thấy "phân đoạn" (lược đồ, bảng, trường) dễ dàng hơn nhiều; đoán tôi đã mượn nó từ ngày MS SQL của tôi – IAmYourFaja

+0

Ý định của bạn không rõ ràng. Bạn có muốn cập nhật một "động vật", thay đổi một trong các thuộc tính của nó thành (trỏ tới) một giá trị mới không? Ngoài ra: các định nghĩa bảng thực tế sẽ giúp ích. – wildplasser

Trả lời

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

bạn đang hỏi một cái gì đó như thế này phải không ..?

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) 

thử này ..

+0

cảm ơn (+1) - vui lòng xem ví dụ trong chỉnh sửa của tôi. Bạn có thể xác nhận rằng mã của bạn ở trên hoàn thành những gì tôi đang tìm kiếm trong ví dụ của tôi không? Cảm ơn một lần nữa! – IAmYourFaja

Các vấn đề liên quan