PostgreSQL에서 업데이트 + 가입하는 방법은 무엇입니까?
기본적으로, 저는 이것을 하고 싶습니다.
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에 이 글을 어떻게 써야 할까요?
UPDATE 구문은 다음과 같습니다.
[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table [ [ AS ] alias ]
SET { column = { expression | DEFAULT } |
( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
[ FROM from_list ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
당신의 경우, 저는 당신이 이것을 원한다고 생각합니다.
UPDATE vehicles_vehicle AS v
SET price = s.price_per_vehicle
FROM shipments_shipment AS s
WHERE v.shipment_id = s.id
또는 두 개 이상의 테이블에서 조인해야 하는 경우:
UPDATE table_1 t1
SET foo = 'new_value'
FROM table_2 t2
JOIN table_3 t3 ON t3.id = t2.t3_id
WHERE
t2.id = t1.t2_id
AND t3.bar = True;
이 상황에서 마크 바이어스의 답변이 최적입니다.더 복잡한 상황에서는 행 ID와 계산된 값을 반환하는 선택 쿼리를 사용하여 다음과 같이 업데이트 쿼리에 연결할 수 있습니다.
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 table1
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은 열 이름의 모호성에 대해 불평할 것입니다.
제 예를 들어 조금 더 설명하겠습니다.
과제: 정확한 정보: 재학생(중등학교를 졸업하려는 학생)이 학교 인증서를 받은 것보다 더 일찍 대학에 신청서를 제출했습니다(네, 발급된 것보다 더 일찍 인증서를 받았습니다(인증서 날짜 지정).그래서 우리는 증명서 발급일에 맞게 신청서 제출일을 늘릴 것입니다.
따라서 다음 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;
Postgre가 됨SQL과 같은 방식으로
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
원본 쿼리는 보시피하위쿼리는본원다▁as는쿼▁original리▁sub위JOIN
의ON
조항이 의 하나가 되었습니다.WHERE
에의 구조건는되성에 됩니다.AND
하위 쿼리에서 변경 사항 없이 이동된 다른 사용자와 함께.그리고 더 이상 할 필요가 없습니다.JOIN
(하위 쿼리에서와 같이) 테이블 자체가 있습니다.
실제로 하고 싶은 사람들을 위해.JOIN
다음을 사용할 수도 있습니다.
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 사있습다에 할 수 .SET
필요한 경우 등호 오른쪽에 있는 섹션.등호 왼쪽의 필드는 원래 "a" 테이블에서 가져온 것으로 간주되므로 테이블 참조가 필요하지 않습니다.
조인이 반환되는 행만 업데이트하는 조인을 수행하려면 다음을 사용합니다.
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
--the below line is critical for updating ONLY joined rows
AND a.pk_id = a_alias.pk_id;
이것은 위에서 언급되었지만 오직 댓글을 통해서만 언급되었습니다.효과가 있는 새로운 답변을 게시하는 올바른 결과를 얻는 것이 중요하기 때문입니다.
시작합니다.
UPDATE vehicles_vehicle v
SET price = s.price_per_vehicle
FROM shipments_shipment s
WHERE v.shipment_id = s.id;
제가 할 수 있는 한 간단합니다.
위의 모든 훌륭한 답변에 상당히 중요한 것을 추가하려면, 당신이 업데이트를 원할 때.join-table
두 가지 문제가 있을 수 있습니다.
- 업데이트할 테이블을 사용할 수 없습니다.
JOIN
하나 또하나 - 포스트그레스는 a를 원합니다.
ON
뒤있는절 뒤에 절JOIN
그래서 당신은 오직 사용할 수 없습니다.where
조항
즉, 기본적으로 다음 쿼리는 유효하지 않습니다.
UPDATE join_a_b
SET count = 10
FROM a
JOIN b on b.id = join_a_b.b_id -- Not valid since join_a_b is used here
WHERE a.id = join_a_b.a_id
AND a.name = 'A'
AND b.name = 'B'
UPDATE join_a_b
SET count = 10
FROM a
JOIN b -- Not valid since there is no ON clause
WHERE a.id = join_a_b.a_id
AND b.id = join_a_b.b_id
a.name = 'A'
AND b.name = 'B'
당신은 의테사합용니다야해의 .FROM
다음과 같은 조항:
UPDATE join_a_b
SET count = 10
FROM a, b
WHERE a.id = join_a_b.a_id
AND b.id = join_a_b.b_id
AND a.name = 'A'
AND b.name = 'B'
어떤 사람들에게는 간단할 수도 있지만, 저는 무슨 일이 일어나고 있는지 궁금해하면서 이 문제에 갇혔기 때문에, 그것이 다른 사람들에게 도움이 되기를 바랍니다.
다음은 Name:의 Mid_Name 필드를 사용하여 Name3 테이블에서 Mid_Name을 업데이트하는 간단한 SQL입니다.
update name3
set mid_name = name.middle_name
from name
where name3.person_id = name.person_id;
아래 링크에는 해결 방법과 사용 방법을 보다 잘 이해하는 데 도움이 되는 예제가 있습니다.update
그리고.join
체념하여
UPDATE product
SET net_price = price - price * discount
FROM
product_segment
WHERE
product.segment_id = product_segment.id;
참조: http://www.postgresqltutorial.com/postgresql-update-join/
첫 번째 테이블 이름: tbl_table1(탭1).두 번째 테이블 이름: tbl_table2(탭2).
tbl_table1의 ac_status 열을 "비활성"으로 설정합니다.
update common.tbl_table1 as tab1
set ac_status= 'INACTIVE' --tbl_table1's "ac_status"
from common.tbl_table2 as tab2
where tab1.ref_id= '1111111'
and tab2.rel_type= 'CUSTOMER';
PostGRE SQL / AWS(SQL 워크벤치)에서 다른 테이블을 사용하여 한 테이블을 업데이트하려면 다음과 같이 하십시오.
PostGRE SQL에서 UPDATE 쿼리에서 조인을 사용하는 방법은 다음과 같습니다.
UPDATE TABLEA set COLUMN_FROM_TABLEA = COLUMN_FROM_TABLEB FROM TABLEA,TABLEB WHERE FILTER_FROM_TABLEA = FILTER_FROM_TABLEB;
Example:
Update Employees Set Date_Of_Exit = Exit_Date_Recorded , Exit_Flg = 1 From Employees, Employee_Exit_Clearance Where Emp_ID = Exit_Emp_ID
표 A - 표 A의 직원 열 - Date_Of_Exit, Emp_ID, Exit_Flg 테이블 Bis - Employee_표 B의 종료_제거 열 - 종료_날짜_기록됨,종료_Emp_아이디
1760개 행이 영향을 받음
실행 시간: 29.18초
고유하지 않은 열에서 조인을 수행할 경우 주의해야 합니다.즉, 조인 결과는 업데이트에 사용할 수 있는 값을 더 많이 생성합니다.
예외를 제기하는 일부 RDMS는 이 경우이지만 PostgreSQL은 결정론적이지 않은 결과로 업데이트를 수행하는 것으로 보입니다.
예
14.1에서 테스트됨
create table tab as
select * from (values
(1,'a'),
(2,'b')
) t(id, att);
▁the다니te▁a▁c가 있는 곳에 합니다.id = 1
업데이트에 대해 두 가지 가능한 값을 제공하는 id. order by
CTE에서 우리는 다른 결과를 얻습니다.
with t as (
select * from (values
(1,'c'),
(1,'d')
) t(id, att)
order by 2 /* Based on this order different update is performed */
)
update tab
set att = t.att
from t
where tab.id = t.id
오름차순으로 열이 다음 값으로 업데이트됩니다.d
높은 값으)로 표시됩니다.
id|att|
--+---+
1|d |
2|b |
CTE에서 내림차순을 사용하는 동안 열은 다음 값으로 업데이트됩니다.c
값숫자 값)
id|att|
--+---+
1|c |
2|b |
이야기의 교훈은 항상 결합이 독특한 결과를 낳는지 확인합니다.
설명서의 관련 부분
FROM을 사용할 때는 조인이 수정할 각 행에 대해 최대 하나의 출력 행을 생성하는지 확인해야 합니다.즉, 대상 행은 다른 테이블의 두 행 이상에 결합할 수 없습니다.이 경우 조인 행 중 하나만 대상 행을 업데이트하는 데 사용되지만 어떤 행이 사용될지는 쉽게 예측할 수 없습니다.
--목표: 선택한 열을 조인(포스트그레스)으로 업데이트합니다.--
UPDATE table1 t1
SET column1 = 'data'
FROM table1
RIGHT JOIN table2
ON table2.id = table1.id
WHERE t1.id IN
(SELECT table2.id FROM table2 WHERE table2.column2 = 12345)
첫 번째 방법은 두 번째 방법보다 느립니다.
첫 번째:
DO $$
DECLARE
page int := 10000;
min_id bigint; max_id bigint;
BEGIN
SELECT max(id),min(id) INTO max_id,min_id FROM opportunities;
FOR j IN min_id..max_id BY page LOOP
UPDATE opportunities SET sec_type = 'Unsec'
FROM opportunities AS opp
INNER JOIN accounts AS acc
ON opp.account_id = acc.id
WHERE acc.borrower = true
AND opp.sec_type IS NULL
AND opp.id >= j AND opp.id < j+page;
COMMIT;
END LOOP;
END; $$;
두 번째:
DO $$
DECLARE
page int := 10000;
min_id bigint; max_id bigint;
BEGIN
SELECT max(id),min(id) INTO max_id,min_id FROM opportunities;
FOR j IN min_id..max_id BY page LOOP
UPDATE opportunities AS opp
SET sec_type = 'Unsec'
FROM accounts AS acc
WHERE opp.account_id = acc.id
AND opp.sec_type IS NULL
AND acc.borrower = true
AND opp.id >= j AND opp.id < j+page;
COMMIT;
END LOOP;
END; $$;
완벽하게 작동합니다!!!
POSTGRE SQL - 조인을 사용하여 업데이트
아래 코드 - 아래와 같이 열과 ID의 위치를 확인합니다.
아래와 같이 정확하게 배치하면, 오직 그것만 작동할 것입니다!
---IF you want to update FIRST table
UPDATE table1
SET attribute1 = table2.attribute1
FROM table2
WHERE table2.product_ID = table1.product_ID;
OR
---IF you want to update SECOND table
UPDATE table2
SET attribute1 = table1.attribute1
FROM table1
WHERE table1.product_ID = table2.product_ID;
한 열에 값이 없고 다른 테이블에서 값을 계산해야 하는 경우(이 예제에서는)price_per_vehicle
부터shipments_shipment
라고 가정하면,shipments_shipment
가지다price
그리고.vehicle_id
열에는 특정 차량에 대한 업데이트가 다음과 같이 표시됩니다.
-- Specific vehicle in this example is with id = 5
WITH prices AS (
SELECT SUM(COALESCE(s.price, 0)) AS price_per_vehicle
FROM shipments_shipment AS s
WHERE s.vehicle_id = 5
)
UPDATE vehicles_vehicle AS v
SET v.price = prices.price_per_vehicle
FROM prices
WHERE v.id = 5
언급URL : https://stackoverflow.com/questions/7869592/how-to-do-an-update-join-in-postgresql
'sourcecode' 카테고리의 다른 글
__builtin_과 __builtin_의 차이점은 무엇입니까? (0) | 2023.05.13 |
---|---|
GitHub: 공공 저장소의 포크를 비공개로 만드는 방법은 무엇입니까? (0) | 2023.05.13 |
VBA(Excel)에서 = Empty()와 Is Empty()의 차이점은 무엇입니까? (0) | 2023.05.13 |
Excel 셀의 여러 줄 텍스트 (0) | 2023.05.13 |
sed를 사용하여 문자열에서 텍스트를 추출하는 방법은 무엇입니까? (0) | 2023.05.13 |