不一致的数据类型:expected - 获得表连接的CLOB

时间:2016-06-20 21:08:51

标签: oracle join clob

Oracle XE 11.一个非常简单的连接查询给了我以下错误:

ORA-00932: inconsistent datatypes: expected - got CLOB

表:

Product
----------------------------------
id, name, description, categoryId 


Catetory
------------------
id, name

产品说明是CLOB。

SQL> desc产品;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(19)
 NAME                                      NOT NULL VARCHAR2(30 CHAR)
 CATEGORYID                                         NUMBER(19)
 DESCRIPTION                                        CLOB

SQL> desc类别;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(19)
 NAME                                      NOT NULL VARCHAR2(30 CHAR)

查询:

SELECT DISTINCT t1.ID, t1.DESCRIPTION, t1.NAME, t0.name FROM Product t1 
LEFT OUTER JOIN Category t0 ON (t0.ID = t1.categoryId);

第1行的错误:     ORA-00932:不一致的数据类型:预期 - 获得CLOB

如果从选择中删除t0.name,它将起作用。怪异。

SELECT DISTINCT t1.ID, t1.DESCRIPTION, t1.NAME FROM Product t1 
LEFT OUTER JOIN Category t0 ON (t0.ID = t1.categoryId);

感谢。

3 个答案:

答案 0 :(得分:6)

DISTINCT关键字不能用于CLOB数据类型。 解决方法是:

SELECT a.*
     , b.clob
 FROM  (SELECT DISTINCT
               ... /* columns list wihtout clob columns */
         FROM  ...
        ) a
 JOIN
       table_with_clobs b
  ON   ...

转到你的样本会是:

SELECT Po.ID, Po.DESCRIPTION, Po.NAME, PC.CatName 
  FROM
   ( SELECT DISTINCT t1.ID, t0.name CatName 
       FROM Product t1 
       LEFT OUTER JOIN Category t0 
         ON t0.ID = t1.categoryId 
    ) PC
    join Product PO
    on PO.ID = PC.ID

答案 1 :(得分:1)

如果你的clob列不超过4000个字符,你可以尝试这个..

SELECT DISTINCT t1.ID, to_char(t1.DESCRIPTION), t1.NAME FROM Product t1 
LEFT OUTER JOIN Category t0 ON (t0.ID = t1.categoryId);

答案 2 :(得分:-1)

正如@dcieslak已经说过,DISTINCT关键字不能用于CLOB数据类型。

  

如果从选择中删除t0.name,它将起作用。怪异。

我想Product.id列上有一个唯一索引。从t0.name子句中删除SELECT时,所有选定的列都来自同一个表。因此,当其中一列具有唯一值(在您的情况下为t1.id)时,所有行将始终是唯一的。这意味着不需要对CLOB列进行任何比较。

BUT 如果Product.id上有唯一索引,那么您根本不需要DISTINCT个关键字。查询:

SELECT t1.ID, t1.DESCRIPTION, t1.NAME, t0.name FROM Product t1 
LEFT OUTER JOIN Category t0 ON (t0.ID = t1.categoryId);

对于Product表中的每一行,您将获得一行,由于不同的t1.ID值,这一行必须是不同的。