데이터 분석/SQL

[쉽게 쓴 SQL] UPDATE JOIN 문

참치바나나 2020. 11. 23. 13:12

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