通过ORA错误反思sql语句规范(r4笔记第41天)

今天快下班的时候,有个开发的同事问我一个问题,说他在客户端执行一条sql语句,里面包含子查询,如果单独执行子查询,会报"invalid identifier"的错误,但是整个sql语句一致性就没有错误,而且数据的结果还是正确的,碰到这种问题,想必都是信心满满,越是奇怪越想探个究竟。 为了能够简单说明这个问题,我使用如下下面的语句来模拟一下。 select *from test1_customer where customer_id in (select customer_id from test2_customer where cycle_code>100); 执行这个语句没有错误。 81 rows selected. 但是执行子查询中的语句却报出了ORA-00904的错误。 select customer_id from test2_customer where cycle_code>100 * ERROR at line 1: ORA-00904: "CYCLE_CODE": invalid identifier

查看表test2_customer的字段,确实没有发现cycle_code这个字段,但是查询竟然还是能够执行。 原因只有一个,那个字段就是从别的表中引用的。只有test1_customer 建表的语句如下: create table test1_customer as select object_id customer_id,object_name customer_name, object_id cycle_code from user_objects; create table test2_customer as select object_id customer_id,object_name customer_name, object_id bill_cycle from user_objects;

在子查询中执行select customer_id from test2_customer where cycle_code>100,字段cycle_code因为在test2_customer中不存在,于是会自动去引用test1_customer的字段值,刚好匹配到了,就输出了结果。 select *from test1_customer where customer_id in (select customer_id from test2_customer where cycle_code>100);

这个问题如果在复杂的场景中还是很难排查的,可能就因为一点点的小问题会导致数据的问题。 所以从这个问题可以反思我们在写sql语句的时候还是需要一些基本的规范,这样就不会导致一些模糊的定义,不明不白的问题。 当引用了多个表的时候最好还是给表起个简单的别名,这样在分析sql语句的时候也比较直观和方便。 上面的查询可以简单的修改为: select *from test1_customer t1 where t1.customer_id in (select t2.customer_id from test2_customer t2 where t2.bill_cycle>100); 如果有问题的话,也能够很快定位倒底是哪里出了问题。 SQL> select *from test1_customer t1 where t1.customer_id in (select t2.customer_id from test2_customer t2 where t2.cycle_code>100); select *from test1_customer t1 where t1.customer_id in (select t2.customer_id from test2_customer t2 where t2.cycle_code>100) * ERROR at line 1: ORA-00904: "T2"."CYCLE_CODE": invalid identifier

引申一下,在创建表,索引,序列的时候也都可以通过规范的命名规则,这样自己也很方便查看。 比如 ACCOUNT_PK就代表是一个主键索引, ACCOUNT_1UQ就是一个唯一性索引 ACCO_COMPANY_CODE_NN 就代表字段COMPANY_CODE是一个not null 约束

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏解Bug之路

文件解析中间件,用SQL去读取各种格式的文件! 顶

(1)完全支持MySql协议 (2)完全支持Mybatis-Generator (3)支持Schema和Table (4)支持客户端创建Schema和Ta...

12430
来自专栏乐沙弥的世界

使用优化器性能视图获取SQL语句执行环境

    Oracle SQL语句的运行环境分为多个不同的层次,主要包括实例级别,会话级别,语句级别,其优先级依次递增。即语句级别的执行环境具 有最高的优先权,...

9120
来自专栏「3306 Pai」社区

浅析ProxySQL用户管理

对于读写分离特别重要,保证了同一个事务中所有的语句都会路由到同一组示例,防止出现同一个事务中,上下文数据不一致的情况。例如,在不开启这个属性的情况下:

32710
来自专栏数据和云

案发现场:被注入的软件及 ORA-600 16703 灾难的恢复

最近帮助一个客户恢复数据库,遇到了如下这个问题。让我们再一次惊醒于数据安全,如果不做好防范,问题总是会来得猝不及防。

30140
来自专栏岑玉海

sqoop 兼容性问题

--direct 只支持mysql 5.0 + 和postgresql 8.3+(只是import) jdbc的jar包需要放在$SQOOP_HOME/lib目...

44260
来自专栏乐沙弥的世界

启用用户进程跟踪

仅仅需要标识该会话并为该会话启用跟踪(专用模式为一对一模式,即一个用户进程对应一个服务器进程)

9920
来自专栏乐沙弥的世界

只读表空间的备份与恢复

--====================== --  只读表空间的备份与恢复 --====================== 一、只读表空间的特性...

10220
来自专栏杨建荣的学习笔记

使用shell生成orabbix自动化配置脚本(r6笔记第53天)

在使用Orabbix监控Oracle的时候,本身和zaabix agent最大的不同便是使用Orabbix不需要对每个数据库实例都安装单独的agent,而是一个...

33080
来自专栏沃趣科技

数据库对象事件与属性统计 | performance_schema全方位介绍

上一篇《事件统计 | performance_schema全方位介绍》详细介绍了performance_schema的事件统计表,但这些统计数据粒度太粗,仅仅按...

43240
来自专栏MasiMaro 的技术博文

OLEDB事务

学过数据的人一般都知道事务的重要性,事务是一种对数据源的一系列更新进行分组或者批处理以便当所有更新都成功时同时提交更新,或者任意一个更新失败时进行回滚将数据库中...

16640

扫码关注云+社区

领取腾讯云代金券