Oracle 20-サブクエリ
4869 ワード
DML文(UPDATE、INSERT、DELETE)
3)サブクエリを使用したUPDATE文
(フォーマットを使用)
UPDATEテーブル名
SET(カラム名[,カラム名,...])=(サブクエリ)--変更する列を単一の列として記述します.
[WHERE条件];
.SETセクションで複数のカラム名を使用する場合は、カラム名を「()」に組み合わせて説明します.
サブクエリのSELECTセクションのカラムリストは、数、順序、タイプと一致する必要があります.
を選択します.サブクエリを使用するSETセクションで単一のカラムを処理する場合は、複数のサブクエリが必要です.
--サブクエリの条件は、変更する値を決定するためにサブクエリから材料を取り出すことです.
--WHERE条件変更するデータを作成するための条件
--WHERE節担当行、更新する行数を抽出する条件
--更新するカラムは1つしかありません.2つのカラム値がサブクエリにある場合、
->サブクエリをサブクエリにマージする
使用例)従業員表で従業員の給与を所属部門の平均給与に更新してください.
--購入活動の結果、CART、MEMBER、[PROD 140]
--サブクエリ:5-7月の購買状況
4)サブクエリを使用したINSERT
(フォーマットを使用)
INSERT INTO表名[(列名[,列名,...])]
サブクエリ
.INSERTで使用されるサブクエリは「()」に記述されていません
▲サブクエリのINSERTを使用してVALES予約項目を省略
**テーブルのコピー
CREATE TABLE表名AS
「サブクエリ」--サブクエリの結果がテーブルに表示されます.
例)REMAINテーブルを作成し、REMAIN TEMPテーブルをコピーします.
3)サブクエリを使用したUPDATE文
(フォーマットを使用)
UPDATEテーブル名
SET(カラム名[,カラム名,...])=(サブクエリ)--変更する列を単一の列として記述します.
[WHERE条件];
.SETセクションで複数のカラム名を使用する場合は、カラム名を「()」に組み合わせて説明します.
サブクエリのSELECTセクションのカラムリストは、数、順序、タイプと一致する必要があります.
を選択します.サブクエリを使用するSETセクションで単一のカラムを処理する場合は、複数のサブクエリが必要です.
--サブクエリの条件は、変更する値を決定するためにサブクエリから材料を取り出すことです.
--WHERE条件変更するデータを作成するための条件
--WHERE節担当行、更新する行数を抽出する条件
--更新するカラムは1つしかありません.2つのカラム値がサブクエリにある場合、
->サブクエリをサブクエリにマージする
使用例)従業員表で従業員の給与を所属部門の平均給与に更新してください.
(서브쿼리:부서별 평균급여)
SELECT DEPARTMENT_ID,
ROUND(AVG(SALARY)) AS ASAL
FROM HR.EMP
GROUP BY DEPARTMENT_ID;
(메인쿼리:사원의 급여 변경)
UPDATE HR.EMP A
SET A.SALARY=(SELECT B.ASAL
FROM (SELECT DEPARTMENT_ID,
ROUND(AVG(SALARY)) AS ASAL
FROM HR.EMP
GROUP BY DEPARTMENT_ID)B
WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID);
--사원이 가지고있는 부서만 구별, 사원이 구별될 필요는 없음
WHERE A.DEPARTMENT_ID=50;
使用例)2005年7月にユーザーの購入状況に応じて、会員のポイントを変更する--購入活動の結果、CART、MEMBER、[PROD 140]
(서브쿼리: 2005년 7월 사용자별 추가 지급될 마일리지)--회원번호,지급될 마일리지
SELECT D.SUMM
FROM (SELECT A.CART_MEMBER AS AID,
SUM(A.CART_QTY*B.PROD_MILEAGE) AS SUMM
FROM CART A, PROD B
WHERE A.CART_NO LIKE '200507%'
AND A.CART_PROD=B.PROD_ID
GROUP BY A.CART_MEMBER)D
(메인쿼리: 갱신)
UPDATE MEMBER C
SET MEM_MILEAGE =(SELECT C.MEM_MILEAGE+D.MSUM --가지고 있는 마일리지에 더해지는 마일리지
FROM (SELECT A.CART_MEMBER AS AID,
SUM(A.CART_QTY*B.PROD_MILEAGE) AS MSUM
FROM CART A, PROD B
WHERE A.CART_NO LIKE '200507%'
AND A.CART_PROD=B.PROD_ID
GROUP BY A.CART_MEMBER)D
WHERE C.MEM_ID=D.AID) --변경할 값
WHERE C.MEM_ID IN (SELECT DISTINCT CART_MEMBER
--MEM_ID가 더 많기 때문에 '='가 아닌 IN연산자가 나와야한다.
FROM CART
WHERE CART_NO LIKE '200507%');
-- 2005년 7월에 판매실적이 있는 회원들만 골라서 변경해라
--바깥쿼리의 where절 : 변경할 사람을 고르는 조건
SELECT MEM_ID,MEM_MILEAGE
FROM MEMBER;
使用例)2005年5-7月の販売状況を確認し、在庫支払表を変更する--서브쿼리
SELECT CART_PROD,
SUM(CART_QTY)
FROM CART
WHERE SUBSTR(CART_NO,1,6) BETWEEN '200505' AND '200507'
GROUP BY CART_PROD;
--재고수불테이블 변경
UPDATE REMAIN A
SET (A.REMAIN_O,A.REMAIN_J_99,A.REMAIN_DATE)=
(SELECT A.REMAIN_O+B.CMT,A.REMAIN_J_99-B.CMT,TO_DATE('20050731')
FROM (SELECT CART_PROD AS CID,
SUM(CART_QTY) AS CMT
FROM CART
WHERE SUBSTR(CART_NO,1,6) BETWEEN '200505' AND '200507'
GROUP BY CART_PROD) B
WHERE A.PROD_ID=B.CID)
WHERE A.PROD_ID IN (SELECT DISTINCT CART_PROD
FROM CART
WHERE SUBSTR(CART_NO,1,6) BETWEEN '200505' AND '200507');
使用例)2005年5-7月の購買状況を照会し、在庫支払表を変更してください.--サブクエリ:5-7月の購買状況
UPDATE REMAIN A
SET (A.REMAIN_I,A.REMAIN_J_99,A.REMAIN_DATE)=
(SELECT A.REMAIN_I+B.BMT,A.REMAIN_J_99+B.BMT,TO_DATE('20050731')
FROM (SELECT BUY_PROD AS BID,
SUM(BUY_QTY) AS BMT
FROM BUYPROD
WHERE BUY_DATE BETWEEN TO_DATE('20050501') AND TO_DATE('20050731')
GROUP BY BUY_PROD)B
WHERE A.PROD_ID=B.BID)
WHERE A.PROD_ID IN (SELECT DISTINCT BUY_PROD
FROM BUYPROD
WHERE BUY_DATE BETWEEN TO_DATE('20050501') AND TO_DATE('20050731'));
集合演算子を使用すると、サブクエリを減らすことができます.4)サブクエリを使用したINSERT
(フォーマットを使用)
INSERT INTO表名[(列名[,列名,...])]
サブクエリ
.INSERTで使用されるサブクエリは「()」に記述されていません
▲サブクエリのINSERTを使用してVALES予約項目を省略
**テーブルのコピー
CREATE TABLE表名AS
「サブクエリ」--サブクエリの結果がテーブルに表示されます.
例)REMAINテーブルを作成し、REMAIN TEMPテーブルをコピーします.
CREATE TABLE REMAIN_TEMP AS
SELECT * FROM REMAIN;
--REMAIN테이블에 있는 모든 행과 열이 REMAIN_TEMP에 들어감
SELECT * FROM REMAIN_TEMP;
DELETE REMAIN_TEMP; --REMAIN의 모든 행을 삭제시킴
(행을 담당하는 WHERE절이 생략되면 모든 행 삭제, TABLE 자체를 없애는 게 아님)
COMMIT;
使用例)「在庫引渡し」表で現在の高値マイナス値の資料を検索し、REMAIN TEMP表に保存します.INSERT INTO REMAIN_TEMP
SELECT * FROM REMAIN
WHERE REMAIN_J_99<0;
SELECT * FROM REMAIN_TEMP;
Reference
この問題について(Oracle 20-サブクエリ), 我々は、より多くの情報をここで見つけました https://velog.io/@gksmf6699/Oracle-20강-서브쿼리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol