본문 바로가기

Database

Way to access the next row value 특정 record에 연속된 (다음 id, 하지만 연속적이지는 않을 수 있는) record를 가져오는 방법입니다. 이를 구현하기 위해서 CTE(Common table expression)을 이용하였습니다. ROW_NUMBER()를 이용하여 연속된 번호를 부여한 뒤에 Join하는 형태의 전략으로 접근하였습니다. WITH CTE AS ( SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNo , * FROM Log WITH (NOLOCK) WHERE dailyID = 191 AND type = 1 ) SELECT CUR.id , CUR.dailyID , CUR.type , '|' AS'|' , NXT.id , NXT.dailyID , NXT.type FROM CTE AS.. 더보기
Insert or update at once 고전적인 방식은 IF EXIST THEN ~ ELSE ~ END 의 구문을 이용하여 분기 처리하는 방법이 있습니다.조금 진보한 방식으로 MERGE INTO를 사용하는 방법이 있을 수 있습니다. (MSSQL 2008~)이는 Oracle등의 DBMS에서도 지원하는 것으로 알고 있습니다.조건절에 작성한 부분은 실제 Insert/Update에서 생략이 되므로 타이핑할 양도 줄어드는 효과가 있습니다. MERGE INTO [T_N_USER_MOVIE_FAVORITES] -- 대상 table USING(SELECT '0' AS CNT) AS DUAL -- 관용 ON (UserIdx = $useridx$ -- 조건절 AND MovieIdx = $movieidx$) WHEN MATCHED THEN -- 일치하는 reco.. 더보기
How to Determine Whether Two Date Ranges Overlap 간단하지만 많이 필요로 하는 두 데이터 기간의 overlap 판정을 위한 로직을 소개하려고 합니다.다음의 두 기간이 있고, 겹치는 날짜가 있는 지를 판정해야합니다. 기간1: 시작일1 ~ 종료일1 (예: 2016-06-17~2016-06-24)기간2: 시작일2 ~ 종료일2 (예: 2016-06-20~2016-06-30)위의 두 기간은 일부 겹치는 구간이 있습니다. 필요한 결과값은 두 기간이 겹침 여부 (bool)이므로 다음의 로직을 적용하여 복잡한 조건 없이 결과만 판단할 수 있습니다.Reference를 보시면 해당 조건의 proof가 있으므로 참조하세요.(시작일1 = 시작일2) 특별한 내장함수 등의 활용이 없으므로, 대부분의 RDB에서 동일하게 활용할 수 있습니다. Referencehttp://stack.. 더보기
insert or update if exists MS-SQL 를 주로 사용하다가 이번에 오랜만에 Oracle 을 접하니 생각보다 꽤 다른 접근들이 보입니다.쿼리툴(SqlDeveloper)을 포함해서 Oracle 의 철학을 좀 느낄 수 있달까요? :) 제목의 경우는 MS-SQL 에서 IF EXISTS 구문을 이용해서 보통 처리하였는데, Oracle 에서 하는 법을 몰라 잠시 찾아 보았습니다. StackOverFlow의 여러 답변 중, 러닝 커브가 낮고 크게 디메리트가 없는 slavoo의 방법이 괜찮아 보입니다.혹, 더 나은 의견 있으시면 알려주세요.감사합니다. 방법1. insert if not exists2. update. INSERT INTO mytable (id1, t1) SELECT 11, 'x1' FROM DUAL WHERE NOT EXISTS .. 더보기
transaction log for database is full LDF파일의 크기 제한이 걸리거나, 혹은 물리적인 Disk가 full되는 경우 등으로 'Transaction log for database is full' 이라는 Exception이 발생하는 경우가 발생합니다. 개발과정에서 Stress test를 하다가 이러한 과정이 발생했을 때, 간단하게 해결할 수 있는 방법을 정리합니다. 당연, 운용계라면 적절한 Backup 절차에 준하여 대응이 되어야 할 것이며, 아래는 개발과정에 발생하는 이슈를 간단하게 대응하는 방법으로 접근합니다. USE {DBName}; GO -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DATABASE {DBName} SET RECOVERY SIMPL.. 더보기
a connection was successfully established with the server, but then an error occurred during the pre-login handshake MSSQL 접속 후 다음의 에러가 발생하는 경우가 있습니다. 검색해서 보니 대부분은 껏다가 켜라고 하네요. :)저는 다음의 command를 실행하는 것을 시도하는 게 가장 매력적일 것 같습니다.감사합니다. 문제의 원인No configuration for remote connection to SQL serverProtocol issue 해결책command 창에서 다음의 명령을 수행: Netsh winsock resetOr 컴퓨터 재시작 Referenceshttps://msdn.microsoft.com/en-us/library/aa952081.aspxhttps://msdn.microsoft.com/ko-kr/library/aa952081.aspx> BizTalk Server 데이터베이스가 포함된 원격 SQL.. 더보기
Unique index setting #2 (with Criteria) Unique Index 는 중복값의 입력을 방지하는 경우 매우 유용하게 사용할 수 있습니다. 다만, 단일 값이라는 판단은 '조건'을 가지고 판단해야 하는 경우가 있습니다. 예를 들면 특정 상태의 값은 중복이 될 수 없다던지... NULL 값은 중복을 허용한다던지. 이를 위해서 WHERE 절을 사용할 수 있습니다. 예제는 다음과 같습니다. CREATE UNIQUE NONCLUSTERED INDEX [uq_user_email] ON [dbo].[TB_User] ( [Email] ASC ) WHERE [Email] IS NOT NULL WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, D.. 더보기
CTE 무한루프 이전에 유용하게 사용했던 CTE SQL에서 간혹 오류가 나는 경우가 발생했습니다.'문의 완료되기 전에 최대 재귀 횟수(?)가 초과되었습니다.' 이는 서버에서 CTE로 인한 무한루프를 방지하기 위한 장치의 제한이 걸렸기 때문일 가능성이 있습니다.기본적으로 최대 100회의 재귀 CTE가 허용되며, 이는 0~32,767의 범위를 가질 수 있습니다.질의의 마지막에 다음 구문을 추가하는 것으로 재귀 회수를 제어할 수 있습니다. SQL OPTION (MAXRECURSION 100) Referenceshttps://technet.microsoft.com/ko-kr/library/ms175972(v=sql.105).aspxhttps://technet.microsoft.com/ko-kr/library/ms181714(v.. 더보기
CTE 일반적으로 Group은 재귀적으로 참조하는 형태입니다.(Group.ParentGroupId = Group.Id 형태) 이에 데이터 조회시 반복처리를 해야 하는 형태가 발생함으로 이를 쉽게 처리할 수 있는 방법은 없을까요?해답은 MSSQL 2005 이후 버전에서 지원하는 CTE(Common Table Expression) 입니다. Anchor set을 설정하고, 이를 재귀적으로 순환하며 참조하게 하는 SQL를 작성할 수 있습니다. Example WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS ( -- Anchor SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel FROM dbo.MyEm.. 더보기
Create table with sequence.nextval in oracle Oracle에 대한 경험은 거의 없는데. MSSQL DB instance 의 clone을 Oracle에 만들어야 하는 경우가 발생했습니다. 편의를 위해서 IDENTITY() 설정을 하고 싶어서 찾아봤더니 12c 이후에 MSSQL과 유사한 형태의 지원이 가능하네요. 하필 11g를 돌리고 있어서 최신 기술을 쓰지 못하는 상황이 매우! 안타깝습니다... 11g 이전의 방식은 이러한 case에 대한 직접적인 방법이 없어서, Insert trigger를 이용하여 IDENTITY column value가 없는 경우 자동으로 sequence.NextVal 을 가져다 사용하는 형태입니다. CREATE OR REPLACE TRIGGER my_trigger BEFORE INSERT ON qname FOR EACH ROW .. 더보기