목록IT_DataBase_Oracle (6)
veggie의 기술기록
쿼리를 작성하다 보면 행을 열로 변환하거나 열을 행으로 변환하는 작업을 심심치 않게 해볼 수가 있다. 이 전까지는 DECODE와 집계함수를 이용해서 작업을 했다면, 오라클 11g부터는 이를 쉽게 할 수 있는 PIVOT 함수가 생겼다고 한다. 1. DECODE와 집계함수를 이용한 피벗(이전버전) SELECT TO_CHAR(DTE, 'YY') || '년' YEAR , SUM(DECODE(TO_CHAR(DTE, 'MM'),'01', 1, 0)) AS "1월" , SUM(DECODE(TO_CHAR(DTE, 'MM'),'02', 1, 0)) AS "2월" , SUM(DECODE(TO_CHAR(DTE, 'MM'),'03', 1, 0)) AS "3월" , SUM(DECODE(TO_CHAR(DTE, 'MM'),'04'..
주석 달기에 용이하도록 쓰이는줄로만 알았는데 ANSI 다중join문을 써보니 알겠다. select a.test1, b.test2 from table1 a, table2 b on a.column = b.column a.column2 = #column2# 이런식으로 태그를 써서 쿼리문을 처리하는 경우 태그 바로 윗부분이 조인문이라 WHERE을 어떻게 써야할지 애매한데 이 때 태그위에 WHERE 1=1을 써주면 오류 없이 잘 작동한다. 저런 애매한 경우에 where절을 위치시켜야 할 때 쓰는 의미 없는 조건 역할을 하는 것 같다.
OUTER JOIN은 정상적으로 조인 조건을 만족하지 못하는 데이터들도 보기 위해 사용되는데, OUTER JOIN의 연산자는 (+)로, 조인시킬 값이 없는 쪽에 (+)를 붙인다. 즉, 조인시킬 테이블의 데이터에 NULL이 들어와도 모두 보여주겠다는 의미이다. 결론적으로 OUTER JOIN과 (+)는 같은 의미인 것인데 오류 메시지에서 보이는 이전방식의 포괄조인이란 (+) 쓰는 방식을 의미한다. ANSI 스타일과 (+)는 의미는 같아도 혼용할 수 없다는 오류 메시지였다. ANSI는 ANSI끼리... (+)는 (+)끼리... 유유상종이라는 것. 참고로 오라클 9 부터는 FULL OUTER JOIN이 가능해졌다고 한다. 출처 : https://www.oraexcel.com/oracle-12cR1-ORA-251..
기본키를 구성하는 컬럼이 복수일 수는 있어도 기본키는 복수일 수 없다 CREATE TABLE TEST( TEST1 NUMBER(10), TEST2 VARCHAR(20) CONSTRAINT TEST_PK(NAME) PRIMARY KEY(TEST1, TEST2) ); TEST1과 TEST2가 묶여 기본키로 설정되었기 때문에 TEST1과 TEST2는 중복될 수 있어도 (별다른 제약을 걸지 않았다는 것을 가정) TEST1 & TEST2를 묶어서는 NOT NULL 그리고 UNIQUE 제약이 걸리게 된다. 출처 : https://moonong.tistory.com/48
원인 : ON절에서 참조하는 열을 갱신하려 했기 때문 나의 쿼리 : MERGE INTO TABLE1 a USING (SELECT SEQ , substr(NUM ,1,11) AS NUM3 ,NUM ,NUM2 FROM TABLE1 WHERE 1=1 AND NUM LIKE '%-%') b ON (a.SEQ =b.seq AND a.NUM = b.NUM AND a.NUM2 = b.NUM2) WHEN MATCHED THEN UPDATE SET a.NUM= b.NUM3; merge문을 쓰는 도중 저 오류가 났다. 조건절에 있는 열을 업데이트하려 했기 때문이다. 해결 : 업데이트하려는 열을 조건절에서 빼고, 다른 비교조건이 있다면 찾아서 대체해주면 된다. 나는 NUM2로만으로도 충분히 중복제거가 가능해서, 그냥 NUM..
A테이블과 B테이블을 조인했는데 쿼리 결과값에서 계속 중복값이 나온다던가, 데이터가 나오지 말아야하는데 데이터가 나온다던가 하는 경우 조인 조건을 살펴보자 A테이블과 B테이블에서 인덱스로 설정되어있는 컬럼들 중 쿼리 결과에 필요한 컬럼들은 다 조인해줘야한다! EX) A.COL_NAME(+) = B.COL_NAME 조인시 (+)의 의미는 (+)가 붙어있는 쪽에 NULL값이 들어와도 다 보여주겠다는 의미이다 ANSI표기에서 쓰이는 OUTER JOIN의 의미이다