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

Dav*_*ave 4 oracle join clob

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

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

表:

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


Catetory
------------------
id, name
Run Code Online (Sandbox Code Playgroud)

产品描述是CLOB.

SQL> desc产品;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(19)
 NAME                                      NOT NULL VARCHAR2(30 CHAR)
 CATEGORYID                                         NUMBER(19)
 DESCRIPTION                                        CLOB
Run Code Online (Sandbox Code Playgroud)

SQL> desc类别;

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(19)
 NAME                                      NOT NULL VARCHAR2(30 CHAR)
Run Code Online (Sandbox Code Playgroud)

查询:

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

第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);
Run Code Online (Sandbox Code Playgroud)

谢谢.

dci*_*lak 9

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

SELECT a.*
     , b.clob
 FROM  (SELECT DISTINCT
               ... /* columns list wihtout clob columns */
         FROM  ...
        ) a
 JOIN
       table_with_clobs b
  ON   ...
Run Code Online (Sandbox Code Playgroud)

去你的样本它将是:

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
Run Code Online (Sandbox Code Playgroud)