SQL开发中遇见的问题

SQL开发中遇见的问题

本文主要描述三个问题:

  • 1.修改表中字段类型

  • 2.oracle中(+)连接符的使用

  • 3.分组函数group by 和having的结合使用


修改表中字段类型

    1. 场景:
      • 在修改数据库表结构时,比如修改某一列的字段类型,此时有两种情况
      • 1) 表中有该字段有不为空的值存在,不可以直接修改
      • 2) 要修改的字段类型和原有字段类型兼容,即使该字段有不为空的值也可以直接修改
      • 3) 表中没有数据,可直接进行修改

1、当字段没有数据或者要修改的新类型和原类型兼容时,可以直接modify修改。
2、当字段有数据并用要修改的新类型和原类型不兼容时,要间接新建字段来转移。

案例:
有一个表名为tb,字段段名为name,数据类型varchar(20)。
1、假设字段数据为空,则不管改为什么字段类型,可以直接执行:
alter table tb modify name varchar2(40);
2、假设字段有数据,则改为nvarchar2(20)可以直接执行:
alter table tb modify name varchar2(40);
3、假设字段有数据,则改为varchar2(40)执行时会弹出:“ORA-01439:要更改数据类型,则要修改的列必须为空”,这时要用下面方法来解决这个问题:
/修改原字段名name为name_tmp/
alter table tb rename column name to name_tmp;
/增加一个和原字段名同名的字段name/
alter table tb add name varchar2(40);
/将原字段name_tmp数据更新到增加的字段name/
update tb set name=name_tmp;
/更新完,删除原字段name_tmp/
alter table tb drop column name_tmp;

案例2:

select * from P2P_PROFIT_SHARE_RULES

alter table P2P_PROFIT_SHARE_RULES modify SERVICE_FEE NUMBER(19,4);

由于表中有数据,执行会报错

所以建立临时字段

alter table P2P_PROFIT_SHARE_RULES add SERVICE_FEE_NEW NUMBER(19,4);

update P2P_PROFIT_SHARE_RULES set SERVICE_FEE_NEW =SERVICE_FEE;

alter table P2P_PROFIT_SHARE_RULES drop column SERVICE_FEE;
alter table P2P_PROFIT_SHARE_RULES rename column SERVICE_FEE_NEW to SERVICE_FEE;

oracle中(+)连接符

Oracle中连接字符
* 对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项: *
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部显示,所以是左连接。

基础表会全部显示,匹配表为NULL的字段显示空值!

用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显示,所以是右连接。

select * from t_A a right join t_B b on a.id = b.id;

select * from t_A a right outer join t_B b on a.id = b.id;
等价于
select * from t_A a,t_B b where a.id(+)=b.id;

select * from t_A a left join t_B b on a.id = b.id;

select * from t_A a left outer join t_B b on a.id = b.id;
等价于
select * from t_A a,t_B b where a.id=b.id(+);

select e.prdname,e.AMOUNT ,e.buyusername,e.buyusermobilephone ,e.buyuseridno ,e.buyrefusername,e.buyrefidno,e.buyrefmobilephone,f.USERNAME as regrefusername, f.mobilephone  as regrefmobilephone ,f.idno as regrefidno
   from 
     (select  c.REFERRERMOBILEPHONE,c.prdname,c.AMOUNT,c.REFERRNO, c.USERNAME as buyusername, c.mobilephone as buyusermobilephone,c.idno as buyuseridno ,
     d.username as buyrefusername ,d.idno as buyrefidno,d.mobilephone as buyrefmobilephone
    fromselect b.USERNAME,b.mobilephone,b.idno,a.REFERRERMOBILEPHONE,a.AMOUNT,b.REFERRNO,g.prdname  
    from invest a,ecusr b ,allproduct g
    where a.AMOUNT>10000 and 
    a.investtime>=to_date('2017-12-01','yyyy-MM-dd') and 
    a.investtime<=to_date('2017-12-20','yyyy-MM-dd') and   
    a.investorcifseq=b.cifseq and a.borrowSeq=g.prdCode)c,ecusr d
  where c.REFERRERMOBILEPHONE =d.idno(+)) e,ecusr f
where e.REFERRNO=f.idno(+);

group by + having

SELECT acno FROM eceacct GROUP BY acno HAVING count(acno)>1; --查询绑定卡号重复的绑定卡

猜你喜欢

转载自blog.csdn.net/qq_19704045/article/details/80247760