我不理解的ORA-00932(数据类型不一致:预期-获得CLOB)错误

Jak*_*ake 3 sql oracle

我从这样的查询开始:

    SELECT A.*
      FROM TABLE_A A
INNER JOIN TABLE_B B
        ON A.YEAR = B.YEAR
     WHERE A.ID IN (SELECT ID FROM TABLE_B)
Run Code Online (Sandbox Code Playgroud)

上面的查询给了我重复的记录,所以我这样添加了DISTINCT关键字:

    SELECT DISTINCT A.*
      FROM TABLE_A A
INNER JOIN TABLE_B B
        ON A.YEAR = B.YEAR
     WHERE A.ID IN (SELECT ID FROM TABLE_B)
Run Code Online (Sandbox Code Playgroud)

第二个查询给了我以下错误:

ORA-00932:数据类型不一致:预期-获得CLOB

  1. 00000-“数据类型不一致:预期%s得到了%s”

我最终通过将WHERE子句中的条件移动到INNER JOIN这样来更正查询并消除了重复记录:

    SELECT A.*
      FROM TABLE_A A
INNER JOIN TABLE_B B
        ON A.YEAR = B.YEAR
       AND A.ID = B.ID
Run Code Online (Sandbox Code Playgroud)

我只是不明白为什么第二个查询不起作用。为什么在DISTINCT此处添加关键字会突然导致问题?

Ale*_*ole 5

这不是特别有启发性的错误消息,而是由于对LOB的限制,其中包括:

  • 您不能在查询的ORDER BY子句,查询的GROUP BY子句或聚合函数中指定LOB列。

  • 您不能在SELECT ... DISTINCT或SELECT ... UNIQUE语句或联接中指定LOB列。但是,您可以在SELECT ... DISTINCT语句中指定对象类型列的LOB属性,使用UNION的查询,或者在列的对象类型上定义了MAP或ORDER函数的情况下,使用MINUS set运算符。

您正在点击其中的第二个,但是第一个也不时出现。

您可以使用以下方法伪造相同的情况:

SQL> select distinct col from (select to_clob('test') as col from dual);

ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got CLOB
Run Code Online (Sandbox Code Playgroud)

你将能够使用distinct,如果你上市,而不是仅仅使用非CLOB列,A.*,它包括从CLOB列table_a。

您可以解决此问题,但是更正查询以消除重复项是正确的选择。必须添加distinct到查询中通常表明某些地方出了问题,并且您正在解决问题而不是原因。