database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 10273 게시물 읽기
No. 10273
VIEW 사용
작성자
강정윤
작성일
2021-07-28 19:12
조회수
1,857

원래 처음에 하고 싶었던 건

아래와 같이 WITH구문으로 서브쿼리 하나 만들어놓고 UPDATE하는 거였는데요

Update할 때 WITH구문을 사용할 수 없더라구요..사실 From절이 없어서 entry point가 없을 거라고 생각하긴 했습니다..

WITH UPSERT AS (

SELECT A.ORD_SEQ, SUM(A.ORD_QTY * A.UNT_PRC) ORD_AMT

FROM T_ORD_DET A

GROUP BY A.ORD_SEQ

)

UPDATE T_ORD

SET ORD_AMT = UPSERT.ORD_AMT

, PAY_AMT = (CASE WHEN ORD_ST = 'COMP' THEN UPSERT.ORD_AMT END)

WHERE ORD_SEQ = UPSERT.ORD_SEQ;

 

 

그래서 아래처럼 뷰로 WITH구문 부분을 생성하고 UPDATE할 때 뷰로부터 정보를 가져오고 싶었는데요

커밋도 열심히 해보고, 뷰만 따로 SELECT도 잘 되지만, UPDATE에서 뷰를 못 쓰더라구요..

왜 그런지 아시는 분 있을까요

대안이 잘 생각 안납니다ㅠㅜ 도와주십쇼

 

CREATE VIEW UPSERT AS

SELECT A.ORD_SEQ, SUM(A.ORD_QTY * A.UNT_PRC) ORD_AMT

FROM T_ORD_DET A

GROUP BY A.ORD_SEQ;

 

COMMIT;

 

UPDATE T_ORD

SET ORD_DT = NOW()

, ORD_ST = 'COMP'

, PAY_DT = NOW()

, PAY_TP = (CASE WHEN UPSERT.ORD_AMT > 1000000 THEN 'CARD' ELSE 'BANK' END)

, ORD_AMT = UPSERT.ORD_AMT

, PAY_AMT = UPSERT.ORD_AMT

WHERE ORD_SEQ = UPSERT.ORD_SEQ;

이 글에 대한 댓글이 총 1건 있습니다.

의도한 작업은 전통적으로 트리거가 그 일을 합니다.

트리거 공부하셔서 t_ord_det 테이블에 등록해서 쓰세요.

김상기(ioseph)님이 2021-07-29 16:49에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10277This functionality requires the server to be built with libxml support. [3]
주호민대머리
2021-08-24
1758
10276오라클 프로시져 plpgsql로 변환 (트랜젝션 관련) [2]
나그네
2021-08-23
2726
10275xml 형식의 데이터 인서트 시 에러 [2]
질문왕
2021-08-19
1653
10273VIEW 사용 [1]
강정윤
2021-07-28
1857
10272right sibling’s left-link doesn’t match : block 235 link to 487 instead of expected 102 in index “metric_data_4” [4]
탁구공2
2021-07-27
1965
10271변수 타입 질문 [1]
cookie
2021-07-23
1917
10270아카이브 로그 스위치와 세션 관련 질문 입니다. [3]
초보
2021-07-22
1954
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다