oracle 10+g不支持对类型为CLOB的列进行distinct,也不支持union,所以在遇到此问题,需要对SQL语句进行重新,从另一思想去实现同样的效果的。union没仔细思考过,具体还要看union里面的条件如何,最简单的方法是利用to_char将clob字段转换成char型,但存在一个问题,如clob中的字符长度超过4000时会报错。在此主要对distinct的转换方法进行列举:
表结构如下:
Table1:
id(varchar) title(varchar) content(clob)
1 title1 <CLOB>
2 title2 <CLOB>
Table2:
id(varchar) table_id(varchar) object(varchar)
1 1 123
2 1 abc
3 1 111
4 1 222
5 2 123
SQL语句:
select distinct table1.* from table2 table2 left join table1 table1 on table1.id = talbe2.table_id
where table2.object = '123' or table2.object = '111' or table2.object = '222' or table2.object = '333'
执行该语句,出现错误:ORA-00932,数据类型不一致:应为-,却获得CLOB。
1、利用rowid,过滤重复的数据。
这个方法的思路来源,就是对某个字段进行distinct时的解决方法。
基本思路:select B.name,B.id from table B where not exists (select 1 from table A where A.name = B.name AND B.id_key > A.id_key)
A表,B表为同一张表,表中的数据存在name相同的,但id_key不同,该语句的目的是把同名的只显示一条即可,其它同名记录过滤。
将该思想转换到当前的问题上,利用每条记录的rowid不同进行过滤。
select p4.*, p4.rowid from (
select p.* from table2 s left join table1 p on s.table_id = p.id
where s1.object = '123' or s1.object = '111' or s1.object = '222' or s1.object = '333'
) p4
where not exists (
select 1, p2.rowid from (
select p1.* from table2 s1 left join table1 p1 on s1.table_id= p1.id
where s1.object = '123' or s1.object = '111' or s1.object = '222' or s1.object = '333') p2
where p4.id = p2.id and p4.rowid > p2.rowid
)
2、采用子查询进行过滤重复的数据。
select * from table1 t1 where t1.id in (
selcet distinct p1.id from table2 s1 left join table1 p1 on s1.table_id= p1.id
where s1.object = '123' or s1.object = '111' or s1.object = '222' or s1.object = '333'
)
3、采用to_char函数,直接使用distinct(前提是:clob字段中的字符长度少于4000)。
select distinct table1.id, table1.tittle, to_char(table1.content) from table2 table2
left join table1 table1 on table1.id = talbe2.table_id
where table2.object = '123' or table2.object = '111' or table2.object = '222' or table2.object = '333'
分享到:
相关推荐
在Oracle数据库中,CLOB...总之,处理Oracle中的CLOB字段需要对数据库特性和事务管理有深入理解,同时也需要熟悉Java或其他编程语言中的CLOB操作。通过合理的策略和技巧,可以有效地管理和操作这些大型文本数据。
Oracle数据库是目前广泛使用的大型关系型数据库...在Oracle数据库中,合理使用上述常用操作指令能够有效完成数据库的日常管理工作,对于Oracle入门级人物而言,掌握这些基本指令是进行进一步数据库学习和实践的基础。
### Oracle查询操作学习笔记知识点详解 #### 一、Oracle用户管理与权限分配 ...以上是关于Oracle查询操作的学习笔记中的核心知识点汇总,希望能够帮助初学者更好地理解和掌握Oracle数据库的基础知识。
以下是对标题和描述中所述知识点的详细说明: **一、Oracle 数据库中的常用数据类型** 1. `VARCHAR2(长度)`:可变长度字符串,其中长度参数指定最大字符数。 2. `CHAR(长度)`:固定长度字符串,无论实际存储的数据...
ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...
将 SELECT 语句的查询结果显示在工作表,可以直接对查询结果进行再操作,如 修改、插入行、删除行、提 交(将表格中的数据改变写入相应的数据库表中)、多功能拷贝、将选择的单元格数据导出为 XLS /CSV /INSERT SQL ...
`SELECT`语句用于从表中检索数据,`DISTINCT`去除重复行,`ORDER BY`进行排序。`WHERE`子句用于指定查询条件,支持`AND`、`OR`和`IN`等逻辑运算符。`LIKE`和`BETWEEN`等也是常用的查询条件。`GROUP BY`和`HAVING`...
文档中提到的emp(员工)和dept(部门)表是Oracle示例数据库中常用的表,它们之间通过deptno字段进行关联。 6. SQL语言基础: 文档中提到了SQL(Structured Query Language),这是用于管理关系数据库管理系统...
### DBA对Oracle SQL编写规范的总结 #### 一、引言 在Oracle数据库开发过程中,遵循一套标准化的SQL编写规范对于提升代码质量、增强可读性和可维护性至关重要。本文档由一位经验丰富的数据库管理员(DBA)撰写,旨在...
将 SELECT 语句的查询结果显示在工作表,可以直接对查询结果进行再操作,如 修改、 插入行、删除行、提交(将表格中的数据改变写入相应的数据库表中)、多功能拷贝、将选 择的单元格数据导出为 XLS /CSV /INSERT SQL...
- **用途:** 在SQL*Plus中进行文件的读写等操作。 - **常见命令:** - `spool filename` (将输出重定向到文件) - `spool off` (停止重定向) **1.1.9 &交互式命令** - **用途:** 运行SQL脚本文件。 - **语法...
数据查询语言 (Data Query Language, DQL) 是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。例如:SELECT(查询) 数据控制语言Data Controlling Language(DCL),用来...
在Oracle数据库中,`SELECT`语句用于从表中检索数据,如`SELECT DISTINCT mycolumn FROM mytable`用于获取`mytable`中`mycolumn`列的所有不重复值。`ORDER BY`子句则用来对查询结果进行排序,如`SELECT price FROM ...
- **文件操作**: SQL*Plus支持基本的文件操作,如读取文件中的命令 (`@file_name`) 和将查询结果输出到文件 (`spool file_name`)。 **1.1.9 & 交互式命令** - **变量替换**: SQL*Plus支持使用 `&variable` 来获取...
- ORDER BY:对结果集进行排序。 - DISTINCT:去除重复行。 3. **Oracle数据类型** - NUMBER:数值类型,可以包含整数和小数。 - VARCHAR2:可变长度字符串。 - DATE:日期和时间类型。 - CLOB和BLOB:用于...
但此时不对数据文件和日志文件进行校验检查。 3、startup open dbname 先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件, 这种方式下可访问数据库中的数据。 4、startup,...