2016-06-20 2 views
3

Oracle XE 11. очень простое соединение запрос дал мне следующую ошибку:непоследовательные: ожидаемые типы данных - получил CLOB для соединения таблиц

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

Спасибо.

ответ

4

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 
0

Если столбец 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); 
+0

Чтобы добавить детали, проблемы DISTINCT и CLOB вызывают проблемы. Попытка удаления дубликатов CLOB, которые потенциально запускаются в гигабайты, не поддерживается. –

0

Как @dcieslak уже говорилось, DISTINCT ключевое слово не может быть использован для CLOB типов данных.

IF I remove the t0.name from selection, it will work. weird.

Я думаю, что есть уникальный указатель на столбце Product.id. Когда вы удаляете t0.name из SELECT, все выбранные столбцы com из той же таблицы. Поэтому, когда один из этих столбцов имеет уникальные значения (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 значений.

Смежные вопросы