Oracle面试题之:复杂的查询与实例解析

        当需要对查询到的结果进行比较复杂的处理的时候,可以借助联合查询、子查询等得到期望的结果。下面列举一个具体的经典试题,希望对读者有所启发。

1.题目要求:

表 NBA 记录了TEAM

夺冠球队的名称及年份:

TEAM               YEAR

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

活塞                 1990

公牛                 1991

公牛                 1992

公牛                 1993

火箭                 1994

火箭                 1995

公牛                 1996

公牛                 1997

公牛                 1998

马刺                 1999

湖人                 2000

湖人                 2001

湖人                 2002

马刺                 2003

活塞                 2004

马刺                 2005

热火                 2006

马刺                 2007

凯尔特人          2008

湖人                 2009

湖人                 2010

请写出一条 SQL 语句,查询出在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少,结果如下:

TEAM              BEGIN     END

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

公牛                 1991       1993

火箭                 1994       1995

公牛                 1996       1998

湖人                 2000       2002

湖人                 2009       2010

2.题目分析:

这道题目可以分解为两步:

第一步:找出所有连续获得冠军的球队

第二

:计算

连续获得冠军的球队的起止年份

3.代码实现

《1》建表并插入一些数据:

-- Create table
create table NBA
(
  team NUMBER,
  year NUMBER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

为了方便起见,这里仅用数字代替球队,随意插入一些测试数据:

《2》我们观察数据发现,如果连续获的一年以上的冠军,那么前一年出现的球队下一年依然会出现,

即:team(year)=team(year+1);

例如下面记录片段 :

活塞                 1990

公牛                 1991

公牛                 1992

公牛                 1993

火箭                 1994

具体的 SQL 语句为:

select n2.team,n2.year
from (select * from nba) n1
join
(select * from nba) n2
on
n1.team=n2.team
where
n1.year=n2.year+1

执行结果为:

《3》最后,将上面的查询结果作为子查询,对数据进行处理,因为得冠军最后一年的下面一年不是冠军,

所以结束年份为

max(year)+1:
select max(nn.team) team,min(nn.year) BeginYear,max(nn.year)+1 EndYear
from
(select n2.team,n2.year from (select * from nba) n1
join
(select * from nba) n2
on
n1.team=n2.team
where
n1.year=n2.year+1) nn
group by
(nn.year-rownum)
order by BeginYear
;

下面是最终的执行结果:

4.总结思考

面对类似的面试题目或者问题,虽然涉及的知识点(子查询、连接查询等)不是很多,但是因为有一些数据的转化和查询的嵌套,可能会造成一些心理素质较差的读者手足无措。因此,面对类似的复杂问题,要学会使用“拆分法”进行分解,一步步地解决问题。

祝你成功!

时间: 2024-08-01 00:37:03

Oracle面试题之:复杂的查询与实例解析的相关文章

oracle 笔试题

ORACLE笔试题一.单选题1.在Oracle中,以下不属于集合操作符的是( ). A. UNION B. SUM C. MINUS D. INTERSECT2.在Oracle中,执行下面的语句:SELECT ceil(-97.342),floor(-97.342),round(-97.342),trunc(-97.342)FROM dual; 哪个函数的返回值不等于-97().A.ceil() B. floor() C. round(0) D. trunc() 3.以下哪个命令可以被用来从表

oracle使用connect by进行级联查询 树型菜单

Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关系的,最顶级的菜单对应的parent_id为0.现假设我们拥有如下记录: id name parent_id 1 菜单01 0 2 菜单02 0 3 菜单03 0 4 菜单0101 1 5 菜单0102

ORACLE 第4节 多表查询

学习目标: ?使用等值和不等值连接在SELECT语句中查询多个表中的数据. ?使用自连接. 使用外连接查询不满足连接条件的数据 Oracle连接 等值连接: 使用连接在多个表中查询数据. SELECT  table1.column, table2.column FROM  table1, table2 WHERE  table1.column1= table2.column2; ?在 WHERE 子句中写入连接条件. ?在表中有相同列时,在列名之前加上表名前缀 两个表的连接 select e.e

Oracle EBS-SQL (SYS-1): sysadmin_用户职责查询.sql

select fu.user_name 用户名, fu.description 用户说明, frv.RESPONSIBILITY_NAME 职责名称, REQUEST_GROUP_NAME 报表组, (select  ppf.FULL_NAME from apps.per_people_f  ppf where fu.employee_id = ppf.PERSON_ID and trunc(sysdate)  between  trunc(ppf.EFFECTIVE_START_DATE) a

Oracle EBS-SQL (SYS-2): sys_在线用户查询.sql

SELECT fs.USER_NAME,       fu.description,       fs.RESPONSIBILITY_NAME,       fs.USER_FORM_NAME,       fs.TIME,       fs.RESP_APPL_ID,       fs.RESPONSIBILITY_ID,       fs.FORM_ID,       fs.FORM_APPL_ID  FROM FND_SIGNON_AUDIT_VIEW fs,       fnd_user

Oracle EBS-SQL (SYS-7):表单个性化查询.sql

animation-timing-function animation-timing-function 规定动画的速度曲线.速度曲线定义动画从一套 CSS 样式变为另一套所用的时间.在平常的取值中,主要有以下几个: 值 描述 linear 动画从头到尾的速度是相同的. ease 默认.动画以低速开始,然后加快,在结束前变慢. ease-in 动画以低速开始. ease-out 动画以低速结束. ease-in-out 动画以低速开始和结束. cubic-bezier(n,n,n,n) 在 cub

oracle[insert 时报错: 单行子查询返回多行]

-- 错误的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_id) (seq_t_b_partner_vehicle.nextval,121, (select id from t_b_car_info where org_id in(1441,1427))) -- Error 单行子查询返回多行 -- 正确的写法 insert into t_b_partner_vehicle(id, partner_id, vehicle_i

Oracle EBS-SQL (MRP-3):检查例外信息查询_建议取消_采购订单.sql

select msi.segment1                                    编码 ,msi.description                                   描述 ,mr.old_order_quantity                        数量 ,mr.old_schedule_date             订单需求日期 ,mipo.po_number                             订单号

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------