UPDATE 문 예 - Amazon Redshift

UPDATE 문 예

다음 예에 사용된 테이블에 대한 자세한 내용은 샘플 데이터베이스 섹션을 참조하세요.

TICKIT 데이터베이스의 CATEGORY 테이블은 다음 행을 포함합니다.

+-------+----------+-----------+--------------------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+-----------+--------------------------------------------+ | 5 | Sports | MLS | Major League Soccer | | 11 | Concerts | Classical | All symphony, concerto, and choir concerts | | 1 | Sports | MLB | Major League Baseball | | 6 | Shows | Musicals | Musical theatre | | 3 | Sports | NFL | National Football League | | 8 | Shows | Opera | All opera and light opera | | 2 | Sports | NHL | National Hockey League | | 9 | Concerts | Pop | All rock and pop music concerts | | 4 | Sports | NBA | National Basketball Association | | 7 | Shows | Plays | All non-musical theatre | | 10 | Concerts | Jazz | All jazz singers and bands | +-------+----------+-----------+--------------------------------------------+

값의 범위를 기반으로 테이블 업데이트

CATID 열에 있는 값의 범위를 기반으로 CATGROUP 열을 업데이트합니다.

UPDATE category SET catgroup='Theatre' WHERE catid BETWEEN 6 AND 8; SELECT * FROM category WHERE catid BETWEEN 6 AND 8; +-------+----------+----------+---------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+----------+---------------------------+ | 6 | Theatre | Musicals | Musical theatre | | 7 | Theatre | Plays | All non-musical theatre | | 8 | Theatre | Opera | All opera and light opera | +-------+----------+----------+---------------------------+

현재 값을 기반으로 테이블 업데이트

현재 CATGROUP 값을 기반으로 CATNAME 및 CATDESC 열을 업데이트합니다.

UPDATE category SET catdesc=default, catname='Shows' WHERE catgroup='Theatre'; SELECT * FROM category WHERE catname='Shows'; +-------+----------+---------+---------+ | catid | catgroup | catname | catdesc | +-------+----------+---------+---------+ | 6 | Theatre | Shows | NULL | | 7 | Theatre | Shows | NULL | | 8 | Theatre | Shows | NULL | +-------+----------+---------+---------+)

이 경우에는 테이블 생성 시 아무런 기본값도 정의되지 않았으므로 CATDESC 열이 null로 설정되었습니다.

다음 명령을 실행하여 CATEGORY 테이블 데이터를 다시 원래 값으로 설정합니다.

TRUNCATE category; COPY category FROM 's3://redshift-downloads/tickit/category_pipe.txt' DELIMITER '|' IGNOREHEADER 1 REGION 'us-east-1' IAM_ROLE default;

WHERE 절 하위 쿼리의 결과를 기반으로 테이블 업데이트

WHERE 절에 있는 하위 쿼리의 결과를 기반으로 CATEGORY 테이블을 업데이트합니다.

UPDATE category SET catdesc='Broadway Musical' WHERE category.catid IN (SELECT category.catid FROM category JOIN event ON category.catid = event.catid JOIN venue ON venue.venueid = event.venueid JOIN sales ON sales.eventid = event.eventid WHERE venuecity='New York City' AND catname='Musicals');

업데이트되는 테이블을 확인합니다.

SELECT * FROM category ORDER BY catid; +-------+----------+-----------+--------------------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+-----------+--------------------------------------------+ | 2 | Sports | NHL | National Hockey League | | 3 | Sports | NFL | National Football League | | 4 | Sports | NBA | National Basketball Association | | 5 | Sports | MLS | Major League Soccer | | 6 | Shows | Musicals | Broadway Musical | | 7 | Shows | Plays | All non-musical theatre | | 8 | Shows | Opera | All opera and light opera | | 9 | Concerts | Pop | All rock and pop music concerts | | 10 | Concerts | Jazz | All jazz singers and bands | | 11 | Concerts | Classical | All symphony, concerto, and choir concerts | +-------+----------+-----------+--------------------------------------------+

WITH 절 하위 쿼리의 결과를 기반으로 테이블 업데이트

WITH 절을 사용하여 하위 쿼리의 결과를 기반으로 CATEGORY 테이블을 업데이트하려면 다음 예를 사용하세요.

WITH u1 as (SELECT catid FROM event ORDER BY catid DESC LIMIT 1) UPDATE category SET catid='200' FROM u1 WHERE u1.catid=category.catid; SELECT * FROM category ORDER BY catid DESC LIMIT 1; +-------+----------+---------+---------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+---------+---------------------------------+ | 200 | Concerts | Pop | All rock and pop music concerts | +-------+----------+---------+---------------------------------+

조인 조건의 결과를 기반으로 테이블 업데이트

EVENT 테이블에서 일치하는 CATID 행을 기반으로 CATEGORY 테이블에서 원래의 행 11개를 업데이트합니다.

UPDATE category SET catid=100 FROM event WHERE event.catid=category.catid; SELECT * FROM category ORDER BY catid; +-------+----------+-----------+--------------------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+-----------+--------------------------------------------+ | 2 | Sports | NHL | National Hockey League | | 3 | Sports | NFL | National Football League | | 4 | Sports | NBA | National Basketball Association | | 5 | Sports | MLS | Major League Soccer | | 10 | Concerts | Jazz | All jazz singers and bands | | 11 | Concerts | Classical | All symphony, concerto, and choir concerts | | 100 | Concerts | Pop | All rock and pop music concerts | | 100 | Shows | Plays | All non-musical theatre | | 100 | Shows | Opera | All opera and light opera | | 100 | Shows | Musicals | Broadway Musical | +-------+----------+-----------+--------------------------------------------+

EVENT 테이블이 FROM 절에 나열되어 있고 대상 테이블에 대한 조인 조건이 WHERE 절에 정의되어 있습니다. 업데이트 자격이 있는 행은 4개뿐입니다. 이들 4개의 행은 CATID 값이 원래 6, 7, 8 및 9였던 행으로, 해당되는 4개의 범주만 EVENT 테이블에 표시됩니다.

SELECT DISTINCT catid FROM event; +-------+ | catid | +-------+ | 6 | | 7 | | 8 | | 9 | +-------+

이전 예를 확장하고 WHERE 절에 다른 조건을 추가하여 CATEGORY 테이블에 있는 원래의 행 11개를 업데이트합니다. CATGROUP 열에 대한 제한 때문에, (4개의 행이 조인 자격이 있지만) 업데이트 자격이 있는 행은 1개뿐입니다.

UPDATE category SET catid=100 FROM event WHERE event.catid=category.catid AND catgroup='Concerts'; SELECT * FROM category WHERE catid=100; +-------+----------+---------+---------------------------------+ | catid | catgroup | catname | catdesc | +-------+----------+---------+---------------------------------+ | 100 | Concerts | Pop | All rock and pop music concerts | +-------+----------+---------+---------------------------------+

이 예를 작성하는 또 다른 방법은 다음과 같습니다.

UPDATE category SET catid=100 FROM event JOIN category cat ON event.catid=cat.catid WHERE cat.catgroup='Concerts';

이 접근 방식의 이점은 조인 기준이 행의 업데이트 자격을 부여하는 다른 기준과는 분명히 구분된다는 점입니다. FROM 절에서 CATEGORY 테이블에 CAT라는 별칭을 사용한다는 점에 유의하십시오.

FROM 절에서 외부 조인으로 업데이트

이전 예에서는 UPDATE 문의 FROM 절에 지정된 내부 조인을 보여주었습니다. 다음 예에서는 FROM 절이 대상 테이블에 대한 외부 조인을 지원하지 않으므로 오류를 반환합니다.

UPDATE category SET catid=100 FROM event LEFT JOIN category cat ON event.catid=cat.catid WHERE cat.catgroup='Concerts'; ERROR: Target table must be part of an equijoin predicate

외부 조인이 UPDATE 문에 필요한 경우 외부 조인 구문을 하위 쿼리로 이동할 수 있습니다.

UPDATE category SET catid=100 FROM (SELECT event.catid FROM event LEFT JOIN category cat ON event.catid=cat.catid) eventcat WHERE category.catid=eventcat.catid AND catgroup='Concerts';

SET 절에 있는 다른 테이블의 열로 업데이트

TICKIT 샘플 데이터베이스의 listing 테이블을 sales 테이블에 있는 값으로 업데이트하려면 다음 예시를 사용합니다.

SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5; +--------+------------+ | listid | numtickets | +--------+------------+ | 100423 | 4 | | 108334 | 24 | | 117150 | 4 | | 135915 | 20 | | 205927 | 6 | +--------+------------+ UPDATE listing SET numtickets = sales.sellerid FROM sales WHERE sales.sellerid = 1 AND listing.sellerid = sales.sellerid; SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5; +--------+------------+ | listid | numtickets | +--------+------------+ | 100423 | 1 | | 108334 | 1 | | 117150 | 1 | | 135915 | 1 | | 205927 | 1 | +--------+------------+