🪲문제상황
INSERT INTO COMPANY_RESUME (USER_RESUME_NUM, USER_TITLE, USER_ID, USER_NAME, USER_BIRTH ~~)
VALUES( NVL(MAX(user_resume_num), 0) + 1, "아이디", "이름", "생일", "폰번호", "이메일, "주소", "기술스택", "자소서", "북마크")
SQL 오류: ORA-00934: 그룹 함수는 허가되지 않습니다
00934. 00000 - "group function is not allowed here"
가 떠버렸다 MAX함수가 그룹함수의 집계함수인데 이것이 문제가 된 거 같다...
참고: [sql] 그룹 쿼리 (group query)와 서브쿼리(sub query)
[sql] 그룹 쿼리 (group query)와 서브쿼리(sub query)
그룹쿼리(GROUP QUERY)그룹 쿼리는 데이터를 특정 컬럼을 기준으로 그룹화하고, 각 그룹에 대한 집계 함수를 사용하여 요약 정보를 생성한다.집계함수집계함수란 대상 데이터를 특정 그룹으로
o94777.tistory.com
🔎원인 분석
MyBatis에서 저런식으로 자동 숫자 증가 쿼리를 짰던거 같은데,,,틀렸나 싶어서
[spring]스프링 부트 MVC구조 여기를 확인해보니 insert문에서는 서브쿼리안에 그룹함수를 넣고 있었다.
🐣해결
INSERT INTO COMPANY_RESUME (USER_RESUME_NUM, USER_TITLE, USER_ID, USER_NAME, USER_BIRTH ~~)
VALUES( (SELECT NVL(MAX(USER_RESUME_NUM), 0) + 1 FROM USER_RESUME), "아이디", "이름", ~~)
이런식으로 SELECT문안에 넣어줘야 하는 것이었다.
💡왜 insert문안에는 그룹쿼리를 사용하지 못할까?
1. INSERT 문과 그룹 쿼리의 제약
INSERT 문은 새로운 데이터를 삽입하는 데 사용된다. 이 문에서 그룹 쿼리(GROUP BY)를 사용하면 결과가 여러 행으로 반환될 수 있다. 그러나 INSERT 문은 단일 행 또는 단일 값을 기대하므로, 여러 행이 반환되는 그룹 쿼리는 사용할 수 없다.
2. 서브 쿼리의 사용
서브 쿼리는 INSERT 문 내에서 단일 값을 반환할 수 있다. MAX 함수를 서브 쿼리로 감싸면, 해당 쿼리는 단일 행과 단일 열의 결과를 반환하므로, INSERT 문과 잘 호환된다.
3. 명확한 결과
서브 쿼리를 사용하면 명확하게 최대값을 계산하여 단일 결과를 반환할 수 있다. 이는 코드의 가독성을 높이고, 실수를 줄이며, 데이터가 일관되도록 보장한다.
USER_RESUME_NUM의 최대값을 얻은 후, 새로운 값을 계산하여 삽입할 수 있다
INSERT INTO COMPANY_RESUME (USER_RESUME_NUM, USER_TITLE, USER_ID, USER_NAME, USER_BIRTH ~~)
VALUES( (SELECT NVL(MAX(USER_RESUME_NUM), 0) + 1 FROM USER_RESUME), "아이디", "이름", ~~)