【问题标题】:Oracle CTE query: datatype error ORA-00932Oracle CTE 查询:数据类型错误 ORA-00932
【发布时间】:2012-12-04 18:55:56
【问题描述】:

我正在 Oralce 11g 中尝试以下 CTE 查询,但出现错误提示

ORA-00932:不一致的数据类型:预期 NUMBER 得到 CHAR。

任何想法这是什么根本原因?

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

【问题讨论】:

  • 您希望level1 等的初始值为空吗?如果您将这些更改为 0,则查询似乎有效,请参阅此演示 --sqlfiddle.com/#!4/dac35/1
  • 谢谢,这解决了问题,你能把这个作为答案让我接受吗?
  • 也可以使用“cast (null as number) as level2”等
  • 谢谢,我不知道!我认为这是更好的解决方案!

标签: sql oracle oracle11g recursive-query


【解决方案1】:

如果您将查询的第一部分更改为使用零作为level1 等的值而不是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 |

或者您可以cast(null as number) 查询将起作用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多