当前位置: 首页 > 知识库问答 >
问题:

不一致的数据类型:表连接的预期CLOB

农星华
2023-03-14

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

ORA-00932: inconsistent datatypes: expected - got CLOB

表:

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


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

产品描述为CLOB。

SQL

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

SQL

 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。从选择名称,它将工作。奇怪的

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

谢谢。

共有3个答案

薛承志
2023-03-14

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

如果我删除t0。从选择名称,它将工作。奇怪的

我想产品上有一个唯一的索引。id列。当您删除t0时。名称fromSELECT子句,所有选定列都来自同一个表。因此,当其中一列具有唯一值时(在您的示例中为t1.id),则所有行始终是唯一的。这意味着不需要对CLOB列进行任何比较。

但是如果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);

您将从Products表中的每一行获得一行,由于t1. ID值不同,因此必须是不同的。

颜新
2023-03-14

如果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);
施轶
2023-03-14

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
 类似资料: