अद्यतन कैसे करें+PostgreSQL में शामिल हों?




syntax (4)

असल में, मैं यह करना चाहता हूं:

update vehicles_vehicle v 
    join shipments_shipment s on v.shipment_id=s.id 
set v.price=s.price_per_vehicle;

मुझे पूरा यकीन है कि MySQL (मेरी पृष्ठभूमि) में काम करेगा, लेकिन यह पोस्टग्रेज़ में काम नहीं कर रहा है। मुझे जो त्रुटि मिलती है वह है:

ERROR:  syntax error at or near "join"
LINE 1: update vehicles_vehicle v join shipments_shipment s on v.shi...
                                  ^

निश्चित रूप से ऐसा करने का एक आसान तरीका है, लेकिन मुझे उचित वाक्यविन्यास नहीं मिल रहा है। तो, मैं PostgreSQL में यह कैसे लिखूंगा?


इस स्थिति में मार्क बेयर्स का जवाब इष्टतम है। हालांकि अधिक जटिल स्थितियों में आप चुनिंदा क्वेरी ले सकते हैं जो पंक्तियों और गणना मूल्यों को वापस लाता है और इसे इस तरह की अद्यतन क्वेरी से संलग्न करता है:

with t as (
  -- Any generic query which returns rowid and corresponding calculated values
  select t1.id as rowid, f(t2, t2) as calculatedvalue
  from table1 as t1
  join table2 as t2 on t2.referenceid = t1.id
)
update t1
set value = t.calculatedvalue
from t
where id = t.rowid

यह दृष्टिकोण आपको अपनी चुनिंदा क्वेरी को विकसित और परीक्षण करने देता है और दो चरणों में इसे अद्यतन क्वेरी में परिवर्तित कर देता है।

तो आपके मामले में परिणाम पूछताछ होगी:

with t as (
    select v.id as rowid, s.price_per_vehicle as calculatedvalue
    from vehicles_vehicle v 
    join shipments_shipment s on v.shipment_id = s.id 
)
update vehicles_vehicle
set price = t.calculatedvalue
from t
where id = t.rowid

ध्यान दें कि कॉलम उपनाम अनिवार्य हैं अन्यथा PostgreSQL स्तंभ नामों की अस्पष्टता के बारे में शिकायत करेगा।


उन लोगों के लिए जो वास्तव में शामिल होना चाहते हैं, आप भी इसका उपयोग कर सकते हैं:

UPDATE a
SET price = b_alias.unit_price
FROM a as a_alias
LEFT JOIN b as b_alias ON a_alias.b_fk = b_alias.id
WHERE a_alias.unit_name LIKE 'some_value' AND a.id = a_alias.id;

यदि आवश्यक हो तो आप बराबर चिह्न के दाईं ओर एसईटी अनुभाग में a_alias का उपयोग कर सकते हैं। बराबर चिह्न के बाईं ओर वाले फ़ील्ड को तालिका संदर्भ की आवश्यकता नहीं होती है क्योंकि उन्हें मूल "ए" तालिका से समझा जाता है।


यहां एक साधारण एसक्यूएल है जो नाम से तालिका__नाम फ़ील्ड का उपयोग कर नाम 3 तालिका पर Mid_Name को अपडेट करता है:

update name3
set mid_name = name.middle_name
from name
where name3.person_id = name.person_id;

ये रहा:

update vehicles_vehicle v
set price=s.price_per_vehicle
from shipments_shipment s
where v.shipment_id=s.id;

सरल मैं इसे बना सकता था। धन्यवाद दोस्तों!

यह भी कर सकते हैं:

update vehicles_vehicle 
set price=s.price_per_vehicle
from vehicles_vehicle v
join shipments_shipment s on v.shipment_id=s.id;

लेकिन फिर आपको वहां दो बार वाहन की मेज मिल गई है, और आपको केवल एक बार इसे उपनाम करने की अनुमति है, और आप "सेट" भाग में उपनाम का उपयोग नहीं कर सकते हैं।







syntax