一、形如 select * from t1 where col1 not in (select col1_1 from t2)的sql语句,如果t2表的col1_1中有空记录,则不会有返回结果。这应该是因为not in 就相当于<>,即 where 1 not in (3, null) 相当于 where 1 <> 3 and 1 <> null,由于and后面的表达式1<>null是不成立的(同样1=null也不成立)所以where条件为假,结果选出的结果集就是零行
这个问题有两种方式可以解决,
其一是过滤子查询中的null记录,select * from t1 where col1 not in (select col1_1 from t2 where col1_1 is not null)
其二是使用not exists,select a.* from t1 a where not exists (select null from t2 where col1_1 = a.col1)
第二种方式之所以会选出需要的结果集是因为exists和in比较方式的区别,在这里子查询中会将a.col1值和每个t2表的col1_1进行等于比较,因为any = null是不成立的,所以最后没有满足条件的记录,于是子查询之外的not exists运算成立,所以可以取到需要的值
换句话说其实很简单,就是null = any 和 null <> any 都是不成立的
网上搜了下更详细的信息,转了一个帖子 http://blog.csdn.net/RedPea/archive/2008/01/22/2059089.aspx
二、一些常用的DDL语句
1、修改表名
在存储过程中使用,由于是DDL语句,需要使用动态SQL ,execute immediate 'rename oldtablename to newtablename'
2、更改字段长度
alter table 表名 modify(字段 varchar2(20), 字段 varchar2(50))
3、用plsql增加删除字段
ALTER TABLE TableName drop column ColumnName; --删除
ALTER TABLE TableName ADD ColumnName NUMBER(10); --增加
4、用plsql编译函数存储过程的方法
Alter ObjectType ObjectName Compile;
三、一些常用查询
外键
select * from user_constraints where constraint_type = 'R'
执行一个由字符串组成的sql
execute immediate v_Sql