使用联合查询时出错

Posted

技术标签:

【中文标题】使用联合查询时出错【英文标题】:Getting error on queries with union 【发布时间】:2018-04-10 17:34:39 【问题描述】:

我在下面的两个查询中进行了联合,但得到了错误: ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB

SQL 看起来像这样:

SELECT A.EMPLID, A.NAME, A.ADM_APPL_NBR, A.ADMIN_FUNCTION, A.STDNT_CAR_NBR, 
A.ACAD_CAREER, A.APPL_PROG_NBR, A.ADMIT_TERM, A.CHECKLIST_CD, A.DESCRSHORT, 
A.CHECKLIST_STATUS, TO_CHAR(A.STATUS_DT,'YYYY-MM-DD'), 
TO_CHAR(A.DUE_DT,'YYYY-MM-DD'), A.COMM_COMMENTS, A.SEQ_3C, A.CHKLST_ITEM_CD, 
A.DESCR, A.ITEM_STATUS, TO_CHAR(A.UM_STATUS_DT_CL,'YYYY-MM-DD'), 
TO_CHAR(A.UM_DUE_DT_CL,'YYYY-MM-DD'), A.RESPONSIBLE_ID 
FROM PS_UM_7902_VW2 A 
WHERE ( 1 = 1 AND EMPLID LIKE DECODE (:1, '', '%', :1) 
AND ADM_APPL_NBR LIKE DECODE(:2, '', '%', :2) 
AND CHECKLIST_CD LIKE DECODE(:3, '', '%', :3) 
 AND A.CHECKLIST_STATUS = :4 
 OR '' = :4 
 AND A.CHECKLIST_STATUS = 'I' 
 OR ( A.CHECKLIST_STATUS = 'C' 
 AND SYSDATE BETWEEN A.TERM_BEGIN_DT AND A.TERM_END_DT) 
 AND ( A.ADMIT_TERM = A.STRM 
 AND SYSDATE BETWEEN A.TERM_BEGIN_DT AND A.TERM_END_DT)) 
 UNION 
 SELECT B.EMPLID, B.NAME, B.ADM_APPL_NBR, B.ADMIN_FUNCTION, B.STDNT_CAR_NBR, 
 B.ACAD_CAREER, B.APPL_PROG_NBR, B.ADMIT_TERM, B.CHECKLIST_CD, B.DESCRSHORT, 
 B.CHECKLIST_STATUS, TO_CHAR(B.STATUS_DT,'YYYY-MM-DD'), 
 TO_CHAR(B.DUE_DT,'YYYY-MM-DD'), B.COMM_COMMENTS, B.SEQ_3C, 
 B.CHKLST_ITEM_CD, B.DESCR, B.ITEM_STATUS, TO_CHAR(B.UM_STATUS_DT_CL,'YYYY- 
 MM-DD'), TO_CHAR(B.UM_DUE_DT_CL,'YYYY-MM-DD'), B.RESPONSIBLE_ID 
 FROM PS_UM_7902_VW2 B 
 WHERE ( B.EMPLID = :1 
 AND 1 = 1 and ADM_APPL_NBR like DECODE(:2, '', '%', :2)
 and CHECKLIST_CD like DECODE(:3, '', '%', :3) 
 AND B.CHECKLIST_STATUS = 'I' 
 OR ( B.CHECKLIST_STATUS = 'C' 
 AND SYSDATE BETWEEN B.TERM_BEGIN_DT AND B.TERM_END_DT) 
 AND B.ADMIT_TERM = B.STRM 
 AND SYSDATE BETWEEN B.TERM_BEGIN_DT AND B.TERM_END_DT);

请大家帮忙。

【问题讨论】:

一次删除一列,直到查询编译。然后修复导致错误的列。 你的意思是我选择的列? 尽管您的两个查询中的每一个都有 21 列,并且它们的名称似乎匹配,但似乎在一个查询中至少有一列的数据类型与另一查询中的相应列不同。 (我假设这两个查询单独运行。)诊断问题的一种方法是删除列,直到错误消失。 当您选择的列之一是 CLOB 时,您不能使用普通的 UNION。看到这个重复的问题:***.com/a/17732879/3061852 SELECT 子句似乎没问题。您正在以相同的顺序从相同的视图中获取相同的列名。检查传递给 TO_CHAR 函数的列是否实际上是 DATE 列。如果它们没问题,那么您的问题仅在 WHERE 子句中。比较列数据类型和每个输入值。 【参考方案1】:

A.COMM_COMMENTSB.COMM_COMMENTS 列是 CLOB。你不能联合 CLOB。 一种替代方法是执行TO_CHAR(A.COMM_COMMENTS)TO_CHAR(B.COMM_COMMENTS),然后它应该可以工作。

【讨论】:

以上是关于使用联合查询时出错的主要内容,如果未能解决你的问题,请参考以下文章

sql联合查询UNION问题

三表联合查询出错是啥原因?

联合索引只用单字段时是否用到索引

mysql联合查询

MySql:联合查询

mysql联合查询