Oracle在查询中使用CLOB获取DISTINCT数字

时间:2014-06-12 12:12:49

标签: sql oracle distinct

编辑:在查询中包含CLOB时,我正在寻找DISTINCT NUMERIC

我有两个关系。

关系一:

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会出现在我的结果集中吗?

1 个答案:

答案 0 :(得分:0)

如果您对clob进行散列,则可以在子查询中使用它来获取具有相同clob散列值的每个eventid_nbr的最大rowid。然后你只需在where子句中过滤你的relation_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表中有很多行,这可能会非常慢,我确信这可以写得更好,但概念是合理的。