自学Oracle,复杂嵌套查询

来源:互联网 发布:云梯vpn mac 编辑:程序博客网 时间:2024/06/05 20:11

本人周二去江苏富士通面试(经老师介绍去面试,此公司主要做linux平台下的c底层开发,而我想应聘的是java,一看面试题一脸蒙b,无奈硬着头皮做。。。),一上来做了五道面试题,其中四道是算法,一道是数据库,其中数据库的那道题比较复杂,面试当场我没能做出来,正好最近在自学oracle(好多公司都要求用oracle),顺便把这道题模拟一下,在同事帮助下终于解决,题目大致如下:

有两张表:用户表:身份证号、籍贯、出身年月等基本信息;贷款表:身份证号、应当还款日期、实际还款日期、借款金额。

问:用sql语句查询:籍贯是江苏苏州、出生年月在1980年初到1989年末、并且多次延迟还款的人的基本信息。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

思考:

1、用户表-贷款表(一对多)

2、date类型比较大小

3、延迟还款:应当还款日期(早) < 实际还款日期(晚)

4、需比较个数

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

实现:先创建了两张表person、loan,并模拟了写数据:

PERSON:


LOAN:


1、首先,先把简单的条件查询写好:

因为简单的查询(籍贯、出生时间)都为PERSON表中的字段,且返回的个人基本信息也都是PERSON表中的内容,所以:

select * from person 
where jg='江苏苏州'
and birthday> to_date('1980/01/01','yyyy/mm/dd') 
and birthday< to_date('1989/12/31','yyyy/mm/dd');

注意date类型的比较方式,需要使用to_date进行格式转换!

范围也可用between and:

select * from person 
where jg='江苏苏州'
and birthday between to_date('1980/01/01','yyyy/mm/dd') and to_date('1989/12/31','yyyy/mm/dd');

查询结果如下:


2、在LOAN表中,查出延迟还款的,并返回他们的身份证号码及对应的条数:

select identify,count(*) as num from loan where ydhk<sjhk group by identify;

结果如下:

(重点!)以此表为查询元表,看做表A,查询出num>2的identify:

 select identify from(
      (
         select identify,count(*) as num from loan where ydhk<sjhk group by identify
      ) A
    ) where num>1;

结果如下:


再在第一步(简单条件查询)的基础上增加此查询条件,最终结果为:

select * from person 
where jg='江苏苏州'
and birthday> to_date('1980/01/01','yyyy/mm/dd') 
and birthday< to_date('1989/12/31','yyyy/mm/dd')

and identify in (
    select identify from(
      (
         select identify,count(*) as num from loan where ydhk<sjhk group by identify
      ) A
    ) where num>1
);


得到最终结果:


(以上sql仅适用于oracle在plsql上的查询,其他数据库稍做改变,但思想不变,如有更简洁的写法请评论或私信)


原创粉丝点击