스터디를 끝마치고, 남은 하루 일과 중 30분 남짓해서 올립니다.
SELECT * FROM EMP;
-- 빈로우가 선택되었을시에 대체방법
SELECT COUNT(EMPNO) AS CNT
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK';
-- 안된다...
SELECT COUNT(EMPNO) AS CNT
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK'
GROUP BY EMPNO;
-- 안된다...
SELECT NVL(COUNT(EMPNO), 0) AS CNT
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK'
GROUP BY EMPNO;
-- 역시 안된다...
SELECT DECODE(COUNT(EMPNO), 0, 0, COUNT(EMPNO)) AS CNT
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK'
GROUP BY EMPNO;
-- 좋다 GROUP BY 빼보자! 된다...!
SELECT DECODE(COUNT(EMPNO), 0, 0, COUNT(EMPNO)) AS CNT
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK';
-- 역시 안된다...
SELECT DECODE(COUNT(EMPNO), 0, 'SALESMAN', MAX(JOB)) AS JOB
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK'
GROUP BY JOB;
-- 이유가 뭘까.....!?
-- GROUP BY를 주었을때와 안주었을시에 왜 다를까...
SELECT DECODE(COUNT(EMPNO), 0, 'SALESMAN', MAX(JOB)) AS JOB
FROM EMP
WHERE ENAME = 'SMITH'
AND JOB <> 'CLERK';
<p><span style="FONT-FAMILY: Monospace">어제 범석씨 질문에 남팀장이 설명을 잘 했지만... 얘기를 계속하면 시간이 길어질까봐서</span><br /><span style="FONT-FAMILY: Monospace">오늘 댓글로 사족을 조금 남겨 봅니다.</span><br /><span style="FONT-FAMILY: Monospace">이미 테스트 하셨던 내용에 SELECT LIST를 조금 변형해서 진행해 보겠습니다.</span></p>
<p><span style="FONT-FAMILY: Monospace">SELECT COUNT(EMPNO) AS CNT, MAX(EMPNO) MAXEMP, 'CASE 1' VALUE</span><br /><span style="FONT-FAMILY: Monospace"> FROM EMP</span><br /><span style="FONT-FAMILY: Monospace"> WHERE ENAME = 'SMITH'</span><br /><span style="FONT-FAMILY: Monospace"> AND JOB <> 'CLERK'</span><br /><span style="FONT-FAMILY: Monospace"> UNION ALL </span><br /><span style="FONT-FAMILY: Monospace">SELECT COUNT(EMPNO) AS CNT, MAX(EMPNO) MAXEMP, 'CASE 2' VALUE</span><br /><span style="FONT-FAMILY: Monospace"> FROM EMP</span><br /><span style="FONT-FAMILY: Monospace"> WHERE ENAME = 'SMITH'</span><br /><span style="FONT-FAMILY: Monospace"> AND JOB <> 'CLERK'</span><br /><span style="FONT-FAMILY: Monospace"> GROUP BY EMPNO </span><br /><span style="FONT-FAMILY: Monospace">;</span></p>
<p><span style="FONT-FAMILY: Monospace">----------------------------------------------------------------------------------------</span><br /><span style="FONT-FAMILY: Monospace">| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |</span><br /><span style="FONT-FAMILY: Monospace">----------------------------------------------------------------------------------------</span><br /><span style="FONT-FAMILY: Monospace">| 0 | SELECT STATEMENT | | 2 | 36 | 6 (34)| 00:00:01 |</span><br /><span style="FONT-FAMILY: Monospace">| 1 | UNION-ALL | | | | | |</span><br /><span style="FONT-FAMILY: Monospace">| 2 | SORT AGGREGATE | | 1 | 18 | | |</span><br /><span style="FONT-FAMILY: Monospace">|* 3 | TABLE ACCESS FULL | EMP | 1 | 18 | 4 (0)| 00:00:01 |</span><br /><span style="FONT-FAMILY: Monospace">| 4 | SORT GROUP BY NOSORT | | 1 | 18 | 2 (0)| 00:00:01 |</span><br /><span style="FONT-FAMILY: Monospace">|* 5 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 18 | 2 (0)| 00:00:01 |</span><br /><span style="FONT-FAMILY: Monospace">| 6 | INDEX FULL SCAN | PK_EMP | 14 | | 1 (0)| 00:00:01 |</span><br /><span style="FONT-FAMILY: Monospace">----------------------------------------------------------------------------------------</span></p>
<p><span style="FONT-FAMILY: Monospace"><결과></span><br /><span style="FONT-FAMILY: Monospace">CNT | MAXEMP | VALUE</span><br /><span style="FONT-FAMILY: Monospace">----|--------|-------</span><br /><span style="FONT-FAMILY: Monospace"> 0 | | CASE 1</span></p>
<p><br /><span style="FONT-FAMILY: Monospace">어제도 얘기했지만 차이점은 GROUP BY의 사용여부입니다.</span><br /><span style="FONT-FAMILY: Monospace">우선 GRUOP BY를 빼면 우리가 일반적으로 사용하는 단순한 SQL 구문입니다.</span><br /><span style="FONT-FAMILY: Monospace">다만 DBMS에서 데이타를 표현할 때 SELECT LIST에서 GROUP 함수를 쓰면 무조건 표현을 해야한다는</span><br /><span style="FONT-FAMILY: Monospace">차이가 있습니다.</span><br /><span style="FONT-FAMILY: Monospace">데이타가 존재하지 않더라도 COUNT의 경우는 0, MIN/MAX의 경우는 NULL형태로...(★★★)</span><br /><span style="FONT-FAMILY: Monospace">하지만 두번째 SELECT 리스트에는 NO DATA에서 GROUP BY를 해야할 대상이 없기에</span><br /><span style="FONT-FAMILY: Monospace">다른 무슨 짓을 해도 데이타는 표현이 안되겠지요..</span></p>
<p><span style="FONT-FAMILY: Monospace">조금 더 사족을 덧붙이면 다음과 같은 원리입니다.</span><br /><span style="FONT-FAMILY: Monospace">CREAET TABLE YHN_TMP (A NUMBER);</span></p>
<p><span style="FONT-FAMILY: Monospace">SELECT COUNT(*), MAX(A), 'CASE1' CASE FROM YHN_TMP</span><br /><span style="FONT-FAMILY: Monospace">UNION ALL</span><br /><span style="FONT-FAMILY: Monospace">SELECT COUNT(*), MAX(A), 'CASE2' CASE FROM YHN_TMP</span><br /><span style="FONT-FAMILY: Monospace"> GROUP BY A</span><br /><span style="FONT-FAMILY: Monospace">;</span></p>
<p><span style="FONT-FAMILY: Monospace">위 SQL처럼 빈 껍데기 테이블을 하나 만들고 COUNT(*)를 하면 당연히 0이 나오겠지만,</span><br /><span style="FONT-FAMILY: Monospace">NO DATA인 상태에서 GROUP BY를 한다면 역시 DATA는 NO ROW SELECTED라고 표현이 되겠지요.</span></p>
<p><span style="FONT-FAMILY: Monospace"></span> </p>
<p><span style="FONT-FAMILY: Monospace">SELECT MAX(1) MAX_VAL, 'CASE1' CASE </span><br /><span style="FONT-FAMILY: Monospace"> FROM DUAL </span><br /><span style="FONT-FAMILY: Monospace"> WHERE 1 = 2</span><br /><span style="FONT-FAMILY: Monospace"> UNION ALL</span><br /><span style="FONT-FAMILY: Monospace">SELECT 2 MAX_VAL, 'CASE2' CASE </span><br /><span style="FONT-FAMILY: Monospace"> FROM DUAL </span><br /><span style="FONT-FAMILY: Monospace"> WHERE 1 = 2 </span><br /><span style="FONT-FAMILY: Monospace">;</span></p>
<p><span style="FONT-FAMILY: Monospace">위 SQL도 같은 맥락이겠지요..(어제 다 얘기한 내용 복습입니다. ^^;;;)</span><br /></p>
<p><span style="font-family: Verdana;">감사합니다. 정확한 이해가 되었습니다. </span><span style="font-family: Verdana;">NO ROW SELECTED의 경우 해결점을 찾고자 시작했는데요 <br /></span></p><p><span style="font-family: Verdana;">하다보니 Group 시점에는 어떻게 풀릴까 해서 어떻게든 Group으로 풀어보려했었는데 안되었는데 <br /></span></p><p><span style="font-family: Verdana;">이러한 원리였군요 ㅎㅎ 추가 설명 감사합니다!! (__)</span><span style="font-family: Monospace;"><br /></span></p>