Oracle 在查询中使用 CLOB 获取 DISTINCT 数字
Posted
技术标签:
【中文标题】Oracle 在查询中使用 CLOB 获取 DISTINCT 数字【英文标题】:Oracle get DISTINCT numeric with a CLOB in the query 【发布时间】:2014-06-12 12:12:48 【问题描述】:编辑:我正在寻找 DISTINCT NUMERIC
,同时在查询中包含 CLOB。
我有两个关系。
关系一:
LOGID_NBR NUMBER (12)
APPID_NBR NUMBER (2)
EVENTID_NBR NUMBER (10)
KEYID_NBR NUMBER (8)
KEYVALUE VARCHAR2 (100 Byte)
ARGUMENTSXML VARCHAR2 (4000 Byte)
SENTINDICATOR CHAR (5 Byte)
RECEIVED_DATEDATE DATE sysdate
LAST_UPDATED DATE sysdate
TEXTINDICATOR VARCHAR2 (5 Byte)
UPSELL_ID VARCHAR2 (5 Byte)
GECKOIMAGEIND CHAR (1 Byte)
DELIVERYTYPE VARCHAR2 (30 Byte)
关系二:
LOGID_NBR NUMBER (12)
INPUT_ARGS CLOB
我查询了如下关系:
SELECT EVENTID_NBR, INPUT_ARGS
FROM RELATION_ONE, RELATION_TWO
WHERE RELATION_ONE.LOGID_NBR = RELATION_TWO.LOGID_NBR AND
EVENTID_NBR BETWEEN 143 AND 192 AND
EVENTID_NBR != 172 AND SYSDATE - 7 >= RELATION_ONE.LAST_UPDATED
ORDER BY EVENTID_NBR;
我经常在我的结果集中收到相同的EVENTID_NBR
,并且只对DISTINCT
结果感兴趣。但是,将 DISTINCT
关键字添加到查询中,如下所示:
SELECT DISTINCT EVENTID_NBR, INPUT_ARGS ...
产生以下错误结果:
[Error] Execution (8: 32): ORA-00932: inconsistent datatypes: expected - got CLOB
所以,我开始在网上搜索如何解决这个问题,并找到了this 甚至this。我要将此 CLOB 转换成什么,以使 DISTINCT EVENTID_NBR
及其关联的 CLOB
出现在我的结果集中?
【问题讨论】:
副本应该让您进一步了解如何获取 DISTINCT 数据集。但是,我会重新考虑这是否真的是问题所在,并首先弄清楚为什么你需要一个 DISTINCT。会不会是你的数据库没有正确规范化? @Ben 我需要一个不同的,因为每个EVENTID_NBR
都有一个不同的CLOB
。因此,我可能有一百个EVENTID_NBR = 143
,但每个都有不同的CLOB
,因此,我只对DISTINCT
对感兴趣。
那么对于单个 eventid_nbr,您有一堆不同的 input_args (CLOB) 值,并且一些 input_args 在同一个 eventid_nbr 中是相同的?
【参考方案1】:
如果对 clob 进行哈希处理,则可以在子查询中使用它来获取具有相同 clob 哈希值的每个 eventid_nbr 的最大 rowid。然后,您只需在 where 子句中过滤您的 relationship_two 表。
SELECT EVENTID_NBR, INPUT_ARGS
FROM RELATION_ONE, RELATION_TWO
WHERE RELATION_ONE.LOGID_NBR = RELATION_TWO.LOGID_NBR AND
EVENTID_NBR BETWEEN 143 AND 192 AND
EVENTID_NBR != 172 AND SYSDATE - 7 >= RELATION_ONE.LAST_UPDATED
AND (RELATION_TWO.EVENTID_NBR, RELATION_TWO.ROWID) IN
(SELECT DISTINCT EVENTID_NBR,
MAX(ROWID) OVER (PARTITION BY EVENTID_NBR, DBMS_HASH(INPUT_ARGS,3))
FROM RELATION_TWO);
HASH 中的 3 指定了 SHA,但你也可以使用 MD4 (1) 或 MD5 (2) 如果你喜欢。
我认为如果 RELATION_TWO 表中有很多行,这可能会非常慢,我相信这可以写得更好,但这个概念是合理的。
【讨论】:
以上是关于Oracle 在查询中使用 CLOB 获取 DISTINCT 数字的主要内容,如果未能解决你的问题,请参考以下文章