程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle面試題之:復雜的查詢與實例解析

Oracle面試題之:復雜的查詢與實例解析

編輯:Oracle教程

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.總結思考

面對類似的面試題目或者問題,雖然涉及的知識點(子查詢、連接查詢等)不是很多,但是因為有一些數據的轉化和查詢的嵌套,可能會造成一些心理素質較差的讀者手足無措。因此,面對類似的復雜問題,要學會使用“拆分法”進行分解,一步步地解決問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved