不一致的数据类型:预期 - 为 table join 获取 CLOB
inconsistent datatypes: expected - got CLOB for table join
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);
谢谢。
如果你的 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
数据类型。
解决方法是:
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
正如@dcislak 已经指出的,DISTINCT
关键字不能用于 CLOB
数据类型。
IF I remove the t0.name from selection, it will work. weird.
我想 Product.id
列上有一个唯一索引。当您从 SELECT
子句中删除 t0.name
时,所有选定的列都来自同一个 table。因此,当其中一列具有唯一值(在您的情况下为 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
table 中的每一行中得到一行,由于不同的 t1.ID
值,它们必须是不同的。
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);
谢谢。
如果你的 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
数据类型。
解决方法是:
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
正如@dcislak 已经指出的,DISTINCT
关键字不能用于 CLOB
数据类型。
IF I remove the t0.name from selection, it will work. weird.
我想 Product.id
列上有一个唯一索引。当您从 SELECT
子句中删除 t0.name
时,所有选定的列都来自同一个 table。因此,当其中一列具有唯一值(在您的情况下为 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
table 中的每一行中得到一行,由于不同的 t1.ID
值,它们必须是不同的。