2012-12-04 1 views
1

나는 Oralce 11g의에서 다음 CTE 쿼리를하려고 해요,하지만 난오라클 CTE 쿼리 : 데이터 형식 오류 ORA-00932

ORA-00932를 말하는 오류 얻을 : 일관성없는 데이터 유형을 : 예상 번호는 CHAR을 얻었다.

어떤 아이디어가 근본 원인입니까? 당신이 level1에 대한 값으로 0을 사용하는 쿼리의 첫 번째 부분을 변경하는 경우

create table PC (
EMP_ID NUMBER NULL, 
MGR_ID NUMBER NULL 
); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (1.0, NULL); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (2.0, 1.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (3.0, 1.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (4.0, 2.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (5.0, 2.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (6.0, 2.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (7.0, 3.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (8.0, 5.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (9.0, 7.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (10.0, 5.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (11.0, 7.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (12.0, 9.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (13.0, 9.0); 

INSERT INTO PC (EMP_ID, MGR_ID) 
VALUES (14.0, 9.0); 

SELECT * FROM pc; 

with Tree (EMP_ID, MGR_ID, lv, level1, level2, level3, level4, level5) as 
     (
     SELECT EMP_ID 
     ,  MGR_ID 
     ,  1 as lv 
     ,  1 as level1 
     ,  null as level2 
     ,  null as level3 
     ,  null as level4 
     ,  null as level5 
     FROM PC 
     WHERE MGR_ID IS NULL 
     UNION ALL 
     SELECT E.EMP_ID 
     ,  E.MGR_ID 
     ,  T.lv + 1 
     ,  case when T.lv + 1 = 1 then E.EMP_ID else T.level1 end 
     ,  case when T.lv + 1 = 2 then E.EMP_ID else T.level2 end 
     ,  case when T.lv + 1 = 3 then E.EMP_ID else T.level3 end 
     ,  case when T.lv + 1 = 4 then E.EMP_ID else T.level4 end 
     ,  case when T.lv + 1 = 5 then E.EMP_ID else T.level5 end 
     FROM Tree T inner join PC E 
       ON  (T.EMP_ID = E.MGR_ID) 
     ) 
select * 
from Tree 
+1

당신이 널 (null)로 등'level1'의 그 초기 값을 하시겠습니까보기? 0으로 변경하면 쿼리가 작동하는 것처럼 보입니다.이 데모를보십시오. http://sqlfiddle.com/#!4/dac35/1 – Taryn

+0

감사합니다. 문제가 해결되었으므로 가능한 답으로 만들 수 있습니까? 받아들이시겠습니까? – jrara

+1

"레벨 2로 캐스팅 (null로 숫자)"등을 사용할 수도 있습니다. –

답변

4

등 대신 null의 쿼리가 작동합니다 :

with Tree (EMP_ID, MGR_ID, lv, level1, level2, level3, level4, level5) as 
     (
     SELECT EMP_ID 
     ,  MGR_ID 
     ,  1 as lv 
     ,  1 as level1 
     ,  0 as level2 
     ,  0 as level3 
     ,  0 as level4 
     ,  0 as level5 
     FROM PC 
     WHERE MGR_ID IS NULL 
     UNION ALL 
     SELECT E.EMP_ID 
     ,  E.MGR_ID 
     ,  T.lv + 1 
     ,  case when T.lv + 1 = 1 then E.EMP_ID else T.level1 end 
     ,  case when T.lv + 1 = 2 then E.EMP_ID else T.level2 end 
     ,  case when T.lv + 1 = 3 then E.EMP_ID else T.level3 end 
     ,  case when T.lv + 1 = 4 then E.EMP_ID else T.level4 end 
     ,  case when T.lv + 1 = 5 then E.EMP_ID else T.level5 end 
     FROM Tree T inner join PC E 
       ON  (T.EMP_ID = E.MGR_ID) 
     ) 
select * 
from Tree 

참조 SQL Fiddle with Demo

결과 :

| EMP_ID | MGR_ID | LV | LEVEL1 | LEVEL2 | LEVEL3 | LEVEL4 | LEVEL5 | 
--------------------------------------------------------------------- 
|  1 | (null) | 1 |  1 |  0 |  0 |  0 |  0 | 
|  2 |  1 | 2 |  1 |  2 |  0 |  0 |  0 | 
|  3 |  1 | 2 |  1 |  3 |  0 |  0 |  0 | 
|  4 |  2 | 3 |  1 |  2 |  4 |  0 |  0 | 
|  5 |  2 | 3 |  1 |  2 |  5 |  0 |  0 | 
|  6 |  2 | 3 |  1 |  2 |  6 |  0 |  0 | 
|  7 |  3 | 3 |  1 |  3 |  7 |  0 |  0 | 
|  8 |  5 | 4 |  1 |  2 |  5 |  8 |  0 | 
|  9 |  7 | 4 |  1 |  3 |  7 |  9 |  0 | 
|  10 |  5 | 4 |  1 |  2 |  5 |  10 |  0 | 
|  11 |  7 | 4 |  1 |  3 |  7 |  11 |  0 | 
|  12 |  9 | 5 |  1 |  3 |  7 |  9 |  12 | 
|  13 |  9 | 5 |  1 |  3 |  7 |  9 |  13 | 
|  14 |  9 | 5 |  1 |  3 |  7 |  9 |  14 | 

또는,및 쿼리가 작동합니다

with Tree (EMP_ID, MGR_ID, lv, level1, level2, level3, level4, level5) as 
     (
     SELECT EMP_ID 
     ,  MGR_ID 
     ,  1 as lv 
     ,  1 as level1 
     ,  cast(null as number) as level2 
     ,  cast(null as number) as level3 
     ,  cast(null as number) as level4 
     ,  cast(null as number) as level5 
     FROM PC 
     WHERE MGR_ID IS NULL 
     UNION ALL 
     SELECT E.EMP_ID 
     ,  E.MGR_ID 
     ,  T.lv + 1 
     ,  case when T.lv + 1 = 1 then E.EMP_ID else T.level1 end 
     ,  case when T.lv + 1 = 2 then E.EMP_ID else T.level2 end 
     ,  case when T.lv + 1 = 3 then E.EMP_ID else T.level3 end 
     ,  case when T.lv + 1 = 4 then E.EMP_ID else T.level4 end 
     ,  case when T.lv + 1 = 5 then E.EMP_ID else T.level5 end 
     FROM Tree T inner join PC E 
       ON  (T.EMP_ID = E.MGR_ID) 
     ) 
select * 
from Tree 

SQL Fiddle with Demo