postgresql - 접속 - psql 사용법




PostgreSQL에서 업데이트+가입하는 방법? (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에서 쓸 수 있습니까?


Mark Byers의 대답은이 상황에서 최적입니다. 보다 복잡한 상황에서 ROWID와 계산 된 값을 반환하는 SELECT 쿼리를 가져 와서 다음과 같이 업데이트 쿼리에 첨부 할 수 있습니다.

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은 컬럼 이름의 모호함에 대해 불평 할 것입니다.


다음은 Name의 Middle_Name 필드를 사용하여 Name3 테이블의 Mid_Name을 업데이트하는 간단한 SQL입니다.

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;

그러나 자동차 테이블을 두 번 가져 왔고 별칭을 한 번만 지정할 수 있으며 "설정"부분에서 별칭을 사용할 수 없습니다.


저의 모범을 좀 더 설명하겠습니다.

과제 : 재능있는 학생들 (중고등 학교를 졸업하려는 학생들)이 학교 인증서를받은 것보다 이전에 대학에 지원서를 제출 한 정확한 정보 (예, 지정된 날짜보다 인증서를 발급받은 경우). 인증서 발행일에 맞춰 신청서 제출 날짜를 늘리십시오.

그러므로. 다음 MySQL과 같은 성명

UPDATE applications a
JOIN (
    SELECT ap.id, ab.certificate_issued_at
    FROM abiturients ab
    JOIN applications ap 
    ON ab.id = ap.abiturient_id 
    WHERE ap.documents_taken_at::date < ab.certificate_issued_at
) b
ON a.id = b.id
SET a.documents_taken_at = b.certificate_issued_at;

그런 식으로 PostgreSQL과 같습니다.

UPDATE applications a
SET documents_taken_at = b.certificate_issued_at         -- we can reference joined table here
FROM abiturients b                                       -- joined table
WHERE 
    a.abiturient_id = b.id AND                           -- JOIN ON clause
    a.documents_taken_at::date < b.certificate_issued_at -- Subquery WHERE

보시다시피 원래의 하위 쿼리 JOINON 절은 WHERE 조건 중 하나가되었으며, 변경되지 않은 하위 쿼리에서 다른 항목으로 이동 한 다른 항목 AND 로 연결됩니다. 그리고 (서브 쿼리에서와 같이) 자체적으로 테이블을 JOIN 할 필요가 없습니다.





syntax