DB33 [SQL] ORDER BY와 JOIN 사용 시 정렬 제대로 안됨... 개발 중 ORDER BY가 정상적으로 작동하지 않는 상황이 발생했다. 검색해보니 서브쿼리 내에서 ORDER BY를 사용하고 JOIN을 걸면 이런 문제가 발생한다고 한다. A 테이블 내 쿼리 실행-> B 테이블 내 쿼리 실행 -> 두개 테이블 조인 -> 조건에 부합하는 데이터 체크 -> 정렬 -> 출력 이게 이상적인 순서라면 서브쿼리 내에서 사용했을 때는 A 테이블 내 쿼리 실행-> A 테이블 정렬 -> B 테이블 내 쿼리 실행 -> 두개 테이블 조인 -> 조건에 부합하는 데이터 체크 -> 출력 이렇게 작동한다는 것이다. 해결 방법은 ORDER BY를 가장 바깥쪽으로 빼주는 것이다. 어떤 글에선 limit를 걸면 해결이 된다는데 내 경우엔 변화가 없었다. 원인은 잘 모르겠다... 이거 때문에 CS 들어오고.. DB/SQL 2022. 10. 9. [MySQL] SELECT ~ FOR UPDATE 란? SELECT ~ FOR UPDATE 란 SELECT ~ FOR UPDATE 는 선택된 행들에 대해 배타적으로 LOCK을 거는 것이다. 즉 "데이터 수정하려고 SELECT 했어. 건드리지마 !" 와 같은 뜻이다. 위와 같은 경우 동시제어가 필연적으로 필요하다. 은행의 예금 및 통장의 잔액 변경 시 일관성을 유지하기위해, 영화 및 공연장의 특정 좌석을 예약하기 위해 사용한다. SELECT FOR UPDATE를 사용하지 않으면 다른 세션에서 업데이트를 하고 있어도 같은 행을 조회가능하며, COMMIT을 하기 전까지는 결과가 반영되지 않는다. SELECT ~ FOR UPDATE 의 옵션 SELECT ~ FOR UPDATE: 누군가가 LOCK 중이면 무한정 기다려야 한다. SELECT ~ FOR UPDATE NO.. DB/SQL 2022. 10. 2. [JPA]변경 감지(Dirty Checking)와 병합(merge) 준영속 엔티티란? 영속적 컨텍스트가 관리하지 않는 엔티티. DB에 한 번 거친 데이터(식별자가 생성된 상태). 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티. 준영속 엔티티를 수정하는 방법 2가지 1. 변경감지(Dirty Checking) @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다. findItem.chagePrice(itemParam.getPrice()); //데이터를 수정한다. } 영속성 컨텍스트에서 데이터를 다시 조회한 후에 데이터를 수정하는 방법 파라미.. DB/JPA 2022. 9. 25. LEFT JOIN 시 주의할 점 left join(혹은 left outer join) 시 주의할 점에 대해 알아보자. left join 시 왼쪽에 있는 테이블에만 집중해서 실수를 할 수 있다. left join은 왼쪽 테이블을 기준으로 오른쪽 데이터를 불러오는 것이다. 그런데 여기에는 함정이 있다. 위와 같은 결과를 얻고자 한 상황이다. 위 예시는 N:1 관계이다. 그런데 1:N 관계가 되면 전체 행의 개수가 왼쪽 테이블의 행 개수보다 늘어나고 중복 데이터가 발생한다. 그러므로 left join 시 distinct나 group by로 중복제거를 해야 한다. 데이터를 검증할 때 count를 이용해서 행의 개수가 맞는지 확인하는 방식을 사용한다. 틀릴 이유가 없는데 행의 개수가 다른 경우 이런 함정에 빠진 케이스가 많았다. 위의 사항에 유.. DB/SQL 2022. 9. 4. [Oracle] 3자리 콤마찍기 오라클에서 숫자 3자리 마다 콤마 찍는 방법 숫자인 경우 1 2 SELECT TO_CHAR('1000000', 'FM9,999,999') FROM DUAL; //1,000,000 cs 화폐인 경우 1 2 SELECT TO_CHAR('1000000', 'L9,999,999') FROM DUAL; // \1,000,000 cs DB/Oracle 2022. 5. 12. [Oracle] ORA-06550: PLS-00103: 심볼 ""를 만났습니다 프로시져 호출 시 , 빼먹으면 발생한다. call pr_array(a,b c); =>call pr_array(a,b,c); DB/Oracle 2022. 5. 12. MAX값에서 +1하는데 9이상 증가 안할 때 MAX +1 했는데 9이상 안올라가질 때가 있습니다. 원인은 number max와 string max차이점 입니다. 9, 10 중 number면 10이 더 높지만 string이면 맨 앞글자가 9가 높은거라 9가 나옵니다. 따라서 Type을 NUMBER로 변경해주시면 됩니다 ! DB/Oracle 2022. 5. 2. [Oracle] 숫자, 문자 데이터만 추출하기 숫자, 문자로만 된 데이터를 찾을 때 사용하는 방법이다. 나는 REGEXP_LIKE 함수를 사용할 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT 컬럼명 FROM 테이블이름 WHERE REGEXP_LIKE(컬럼, '[^0-9]') //숫자 외의 것이 포함된 것 SELECT 컬럼명 FROM 테이블이름 WHERE NOT REGEXP_LIKE(컬럼, '[^0-9]') //숫자외의 것이 포함된 것이 아닌 것 → Only 숫자 SELECT 컬럼명 FROM 테이블이름 WHERE REGEXP_LIKE(컬럼, '[0-9]') //숫자가 포함된 것 SELECT 컬럼명 FROM 테이블이름 WHERE NOT REGEXP_LIKE(컬럼, '[0-9]') //숫자가 포함된 것이 .. DB/Oracle 2022. 5. 2. [Oracle] SELECT 결과를 INSERT하기 오라클에서 데이터를 삽입할 때 insert를 사용한다. INSERT는 한줄의 데이터만 삽입가능한데, SELECT한 결과를 INSERT 할 수도 있다. 1. 모든 컬럼 복사 INSERT INTO 삽입할 테이블명 SELECT * FROM 불러올 테이블명 예시 1 2 3 INSERT INTO username_history SELECT * FROM user; cs 2. 특정 컬럼 복사 INSERT INTO 삽입할 테이블명 (컬럼1, 컬럼2, ...) SELECT 컬럼1, 컬럼2, ... FROM 불러올 테이블명 예시 1 2 3 INSERT INTO username_history (user_id, user_name) SELECT user_id, user_name FROM user; cs DB/Oracle 2022. 5. 2. 토드 toad 에서 select 후 그리드에서 바로 수정하기 toad 사용 시 데이터를 수정하는 방법이 여러가지 있다. update 쿼리를 이용해서 수정할 수도 있지만 조회 후 그리드에서 바로 edit 가능한 방법이 있다 ! 1. EDIT 명령어 사용 EDIT 테이블 이름 WHERE 조건문; 테이블 이름 앞에 EDIT을 적어주고 그 뒤로 조건문을 걸어주면 된다. 예시로는 1 2 EDIT TB_MST WHERE CODE = 'A'; cs 2. ROWID 명령어 사용 SELECT ROWID, 컬럼1, 컬럼2 .... FROM 테이블 이름 WHERE 조건문; 기본 조회쿼리 SELECT 뒤에 ROWID를 붙여주면 된다. 예시로는 1 2 3 SELECT ROWID, A.CODE, A.NAME FROM TB_MST WHERE CODE = 'A'; cs DB/Toad 2022. 4. 20. [Oracle]LPAD, RPAD 함수(공백 채우기, 0 채우기) 문자 길이는 고정이고 왼쪽부터, 혹은 오른쪽부터 특정 문자를 채워줘야 하는 경우가 있다. 나는 채번할 때 이 기능이 필요했는데 이때 LPAD 함수를 사용했다. 먼저 정의 LPAD 함수란 지정한 길이만큼 왼쪽부터 특정 문자로 채워주는 함수. LPAD(값, 문자 길이, 채움 문자) 예시: 1 2 3 4 5 6 SELECT 55 AS COL1, LPAD(55, 7) AS COL2, LPAD(55, ' ') AS COL3, LPAD(55, 7, '0') AS COL4, LPAD(55, 7, 'A') AS COL5 FROM DUAL; cs 결과: 위의 결과와 같이 세번째 인자인 채움 문자 칸에 아무 값도 넣지 않으면 디폴트 값으로 공백이 들어간다. RPAD 함수란 지정한 길이만큼 오른쪽부터 특정 문자로 채워주는 .. DB/Oracle 2022. 3. 15. [Oracle] 계층형 쿼리 쉬운 정리(START WITH CONNECT BY) 오라클 사용 시 계층형 쿼리를 종종 사용하게 된다. LEVEL 어쩌구 CONNECT BY 어쩌구.. 처음 마주하면 굉장히 복잡하고 어려워보인다..... 몰라서 검색해봐도 무슨 말인지 이해하기 어려운 설명들이 많다. 무조건 이해를 위주로 한 쉬운 설명을 시작 ! 먼저 계층형 쿼리가 무엇인지 알아보자. 계층형 쿼리란? 테이블에 계층형 구조 즉, 수직적 구조가 존재할 때 이를 조회하기 위한 쿼리이다. 그림으로 쉬운 설명. 회사 조직도를 예시로 들어보자. '회사'는 최상위계층이고, 회사를 중심으로 개발부, 경영지원부, 영업부 세 부서로 나뉜다. 계속해서 부서를 중심으로 하위 계층이 생성되어 있다고 가정하자. 이를 테이블로 나타내면 아래와 같다. 부서번호는 고유식별자로 Primary Key가 된다. START W.. DB/Oracle 2022. 3. 6. 이전 1 2 3 다음