【问题标题】:inconsistent datatypes: expected - got CLOB for table join不一致的数据类型:预期 - 获得表连接的 CLOB
【发布时间】:2016-10-22 06:14:33
【问题描述】:

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> 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);

谢谢。

【问题讨论】:

    标签: oracle join clob


    【解决方案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);
    

    【讨论】:

    • 要添加细节,DISTINCT 和 CLOB 会导致问题。不支持尝试对可能达到千兆字节的 CLOB 进行重复数据删除。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      正如@dcieslak 所述,DISTINCT 关键字不能用于CLOB 数据类型。

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

      我猜Product.id 列上有一个唯一索引。当您从 SELECT 子句中删除 t0.name 时,所有选定的列都来自同一个表。因此,当其中一列具有唯一值(在您的情况下为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);
      

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

      【讨论】:

        猜你喜欢
        • 2017-07-16
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        • 2018-04-30
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多