JOIN과 UPDATE를 같이 하자!
사용법 : 다른 테이블의 내용을 참조해서 UPDATE 한다
UPDATE target_table a --update할 테이블 a
SET a.COLUMN_1 = 표현식 --a의 컬럼을 어떻게 바꾼다
FROM ref_table b --참조 테이블 b 지정
WHERE a.column_1 = b.column_1 -- 조인 조건
;
실습 세팅
product와 product_segment 테이블을 만든다.
모든 product는 1개의 product_segment를 가지도록 만든다.
DROP TABLE product;
CREATE TABLE product_segment (
Id serial PRIMARY KEY,
segment varchar NOT NULL,
discount NUMERIC (4,2)
);
INSERT
INTO
product_segment (segment, discount)
VALUES
('Grand Luxury',0.05),
('Luxury',0.06),
('Mass',0.1)
;
SELECT * FROM product_segment;
CREATE TABLE product (
Id serial PRIMARY KEY,
Name varchar NOT NULL,
price numeric(10,2),
net_price numeric(10,2),
segment_id int NOT NULL,
FOREIGN key(segment_id) REFERENCES product_segment(id)
);
INSERT
INTO
PRODUCT (NAME, PRICE, SEGMENT_ID)
VALUES
('K5', 804.89, 1)
, ('K7', 228.55, 3)
, ('K9', 366.45, 2)
, ('SONATA', 145.33, 3)
, ('SPARK', 551.77, 2)
, ('AVANTE', 261.58, 3)
, ('LOZTE', 519.62, 2)
, ('SANTAFE', 843.31, 1)
, ('TUSON', 254.18, 3)
, ('TRAX', 427.78, 2)
, ('ORANDO', 936.29, 1)
, ('RAY', 910.34, 1)
, ('MORNING', 208.33, 3)
, ('VERNA', 985.45, 1)
, ('K8', 841.26, 1)
, ('TICO', 896.38, 1)
, ('MATIZ', 575.74, 2)
, ('SPORTAGE', 530.64, 2)
, ('ACCENT', 892.43, 1)
, ('TOSCA', 161.71, 3)
;
COMMIT;
SELECT * FROM product;
product segment
product
product의 net_price를 각 제품의 segment_id에 맞는 discount에 따라 할인된 가격으로 채워 넣기.
UPDATE product a
SET net_price = a.price * (1-b.discount)
FROM product_segment b
WHERE a.segment_id = b.id
;
계산식은 다양하게 쓸 수 있다.
a.price - (a.price * b.discount) 라던지..
'데이터 분석 > SQL' 카테고리의 다른 글
[쉽게 쓴 SQL] UPDATE 문 (0) | 2020.11.23 |
---|---|
[쉽게 쓴 SQL] INSERT 구문 (0) | 2020.11.23 |
[쉽게 쓴 SQL] EXISTS (0) | 2020.11.21 |
[쉽게 쓴 SQL] ANY 그리고 IN, ALL (0) | 2020.11.21 |
[쉽게 쓴 SQL] 서브쿼리란? (0) | 2020.11.09 |