본문 바로가기

SQL15

[ERROR] ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다 [ Contents ] 1. 오류 메시지 java.sql.SQLException: ORA-30926: 원본 테이블의 고정 행 집합을 가져올 수 없습니다 2. 원인 MERGE INTO 문에서 USING ON 구문이 여러 행 조회되면서 문제가 발생합니다. MERGE INTO문은 하나의 행을 조회해서 있으면 UPDATE, 없으면 INSERT하는 구문입니다. 따라서 USING ON을 통해 조회되는 데이터는 1개여야 합니다. 3. 해결방안 MERGE INTO TABLE1 A USING TABLE2 B ON (A.PK = B.PK) WHEN MATCHED THEN ... 위와 같이 있는 MERGE INTO 절에서 USING ON으로 조회되는 데이터를 검증합니다. SELECT * FROM TABLE1 A, TABLE.. 2024. 1. 30.
[Oracle] TRUNC과 GROUP BY 이용한 구간별 통계 조회 쿼리 가격대 별 상품 개수 구하기 예제를 통해서, 구간별로 통계를 구하는 쿼리를 작성해봅니다. 아래 예제에서는 집계함수 COUNT를 사용합니다. [ Contents ] 1. 문제 (링크 참조) 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 예제 문제는 프로그래머스 '가격대 별 상품 개수 구하기'를 참조합니다. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 작성 2. 문제 풀이 GROUP BY 구문은 지정된 칼럼들의 값이 같은 것끼리 묶어서 집계할 수 있도록 해줍니다. 그룹별로 묶어서 통계를 내는 데에 사용하며, 해당 구문의 자세.. 2024. 1. 11.
[Oracle] 손쉽게 데이터값을 수정하는 명령어 EDIT (Toad for Oracle) 오라클 토드(Toad)에서는 데이터값을 쉽게 바꿀 수 있는 EDIT 명령어를 제공합니다. 기존에는 Update문으로 데이터를 일일이 수정해야 했지만, EDIT 명령어를 통해 GUI환경에서 ROW를 추가하거나 삭제, 복제까지 가능합니다. 해당 EDIT 명령어에 대해 알아봅니다. [ Contents ] 1. EDIT EDIT 수정할 테이블; EDIT 수정할 테이블 WHERE 조건문; EDIT 명령어의 사용법은 간단합니다. 수정할 테이블만 지정해주면 되며, 특정 데이터를 수정하고 싶으면 조건문을 추가하면 됩니다. EDIT 명령어로 조회된 데이터는 더블 클릭 시에 수정이 가능합니다. 수정을 마치고 COMMIT하면 업데이트 내용이 반영됩니다. 2. 행 추가 삭제 +, -로 행을 추가하거나 삭제할 수 있습니다. 테.. 2023. 12. 5.
[ORACLE] 계층형 쿼리를 활용한 날짜 생성 (CONNECT BY LEVEL 이용) 계층형 쿼리는 흔히 직위나 조직과 같이 계층형 구조를 가진 데이터를 조회할 때 사용합니다. 하지만 계층형 쿼리는 일련의 날짜를 생성하는 데에도 자주 활용됩니다. 이를 날짜 생성에 활용하는 방법을 알아봅니다. [ Contents ] 1. CONNECT BY LEVEL CONNECT BY 조건문 CONNECT BY LEVEL를 잘 이용하면, 반복문 FOR문처럼 순회하며 조회할 수 있습니다. LEVEL이 FOR문의 i 변수라고 생각하시면 되며, 1부터 시작해서 2, 3, 4와 같이 +1씩 오릅니다. SELECT LEVEL, LEVEL*2, LEVEL*LEVEL FROM DUAL CONNECT BY LEVEL 2023. 12. 5.
[Oracle] PL/SQL 프로시저 FOR LOOP (CURSOR, SELECT문 이용) CURSOR와 SELECT문을 이용한 FOR LOOP 구문에 대해 알아봅니다. [ Contents ] 1. CURSOR를 이용한 FOR LOOP DECLARE -- 커서 정의 CURSOR cur_emp IS SELECT emp_id, emp_nm FROM emp WHERE dpmt_cd = '20231013'; BEGIN -- 커서를 통한 FOR LOOP FOR emp IN cur_emp LOOP -- 실행문 DBMS_OUTPUT.PUT_LINE(emp.emp_id || ' ' || emp.emp_nm); END LOOP; END; 커서를 이용할 때에는 미리 정의한 후에, FOR문에서 불러와서 사용합니다. 커서에 담은 내용이 여러 번 사용될 때에는 위와 같이 하는 게 좋습니다. 또한 커서 정의에 필요한 .. 2023. 10. 13.
[Oracle] COALESCE: Null이 아닌 가장 왼쪽 값을 찾는 함수 오라클 SQL문법 중 COALESCE에 대해서 알아봅니다. [ Contents ] 1. COALESCE COALESCE(A, B, C, ...,) 1) A가 Null값이 아니면 A를 Return, Null값이면 B판정 2) B가 Null값이 아니면 B를 Retrun, Null값이면 C판정 3) C가 Null값이 아니면 C를 Retrun, Null값이면... 왼쪽 값부터 차례차례 Null 값인지 판정하며, Null값이 아니면 반환합니다. 즉, Null값이 아닌 가장 왼쪽의 값을 반환하는 함수입니다. 2. 예시 SELECT COALESCE(NULL, 'A', 'B') , COALESCE('A', NULL, 'B') , COALESCE(NULL, NULL, 'C') FROM DUAL '코얼 ~ 레스' 라는 어.. 2023. 4. 27.
[ORACLE] 기존 튜플을 변형해서 테이블에 삽입하는 방법 (여러 건의 튜플 삽입) INSERT INTO SELECT 문을 이용해서 여러 건을 삽입하는 방법을 알아봅니다. [ Contents ] 1. 여러 건 삽입 (INSERT INTO SELECT) INSERT INTO EMP_BOSS SELECT * FROM EMP WHERE RANK = 'BOSS' 일반적으로 INSERT문은 한 개씩 삽입됩니다. 하지만 이는 너무 지겨운 작업이죠. SELECT문을 이용하면 특정 조건의 튜플을 한 번에 넣을 수 있습니다. 다만 칼럼명과 속성값, 순서 등 테이블 구조가 완전히 같아야 가능합니다. 2. 변형해서 여러 건 삽입 (응용) INSERT INTO EMP_INFO( SHYR , SALARY , DPMT , PSD ) SELECT '2023' , SALARY , DPMT , PSD FROM EMP.. 2023. 4. 25.
[Oracle] 특정 월 평일/주말만 조회하는 쿼리문 작성하기 (계층적 쿼리) 특정 월의 평일만 구하는 쿼리문을 알아보겠습니다. [ Contents ] 1. 해당 월의 평일만 조회하는 쿼리 SELECT TO_CHAR(DATES, 'YYYYMMDD') AS 평일 FROM ( SELECT TO_DATE('20230401', 'YYYYMMDD') + LEVEL - 1 AS DATES FROM DUAL CONNECT BY LEVEL 2023. 3. 28.
[Oracle] CONNECT BY LEVEL: 계층적인 SQL, 쿼리에서의 반복문 START WITH, CONNECT BY 문이 쓰이는 계층적 쿼리가 있습니다. 이는 쉽게 이해하면 SQL에서의 반복문이라고 생각하시면 됩니다. 이에 대해 알아보겠습니다. [ Contents ] 1. CONNECT BY LEVEL for i in range(1, 10): print(i) 위와 같은 반복문을 쿼리로 짜려면 어떻게 해야할까요? SQL은 주로 테이블을 조인하고 값을 조회하는 용도로 쓰이기 때문에, 반복문이 딱히 필요하진 않습니다. 하지만, 특정 주기의 날짜 계산이나 문구 반복, 계층적 데이터 추출에는 필요합니다. 이번 시간에는 복잡한 계층적 데이터 추출은 다루지 않고, 단순히 반복문의 기능이 필요한 경우만 다뤄보겠습니다. SELECT LEVEL FROM DUAL CONNECT BY LEVEL 2023. 3. 27.