Oracle面試題之:複雜的查詢與實例解析 (轉發)

當須要對查詢到的結果進行比較複雜的處理的時候,能夠藉助聯合查詢、子查詢等獲得指望的結果。下面列舉一個具體的經典試題,但願對讀者有所啓發。面試

1.題目要求:

 

表 NBA 記錄了TEAMsql

奪冠球隊的名稱及年份:測試

 

 

TEAM               YEAR -------------------------------------------------- 活塞                 1990 公牛                 1991 公牛                 1992 公牛                 1993 火箭                 1994 火箭                 1995 公牛                 1996 公牛                 1997 公牛                 1998 馬刺                 1999 湖人                 2000 湖人                 2001 湖人                 2002 馬刺                 2003 活塞                 2004 馬刺                 2005 熱火                 2006 馬刺                 2007 凱爾特人          2008 湖人                 2009spa

湖人                 2010.net


請寫出一條 SQL 語句,查詢出在此期間連續得到冠軍的有哪些,其連續的年份的起止時間是多少,結果以下: TEAM              BEGIN     END ------------------------------------------- 公牛                 1991       1993 火箭                 1994       1995 公牛                 1996       1998 湖人                 2000       2002 湖人                 2009       2010
code

 

2.題目分析:

這道題目能夠分解爲兩步:blog

第一步:找出全部連續得到冠軍的球隊ip

第二it

 

table

:計算

 

連續得到冠軍的球隊的起止年份

 

3.代碼實現

《1》建表並插入一些數據:
 
  1. -- Create table 
  2. create table NBA 
  3.   team NUMBER, 
  4.   year NUMBER 
  5. tablespace USERS 
  6.   pctfree 10 
  7.   initrans 1 
  8.   maxtrans 255 
  9.   storage 
  10.   ( 
  11.     initial 64K 
  12.     minextents 1 
  13.     maxextents unlimited 
  14.   ); 
-- 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 語句爲:
  1. select n2.team,n2.year  
  2. from (select * from nba) n1   
  3. join 
  4. (select * from nba) n2 
  5. on  
  6. n1.team=n2.team 
  7. where  
  8. n1.year=n2.year+1 
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》最後,將上面的查詢結果做爲子查詢,對數據進行處理,由於得冠軍最後一年的下面一年不是冠軍,
因此結束年份爲
  1. max(year)+1: 
max(year)+1:
 
  1. select max(nn.team) team,min(nn.year) BeginYear,max(nn.year)+1 EndYear  
  2. from  
  3. (select n2.team,n2.year from (select * from nba) n1   
  4. join 
  5. (select * from nba) n2 
  6. on  
  7. n1.team=n2.team 
  8. where  
  9. n1.year=n2.year+1) nn 
  10. group by  
  11. (nn.year-rownum) 
  12. order by BeginYear 
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.總結思考

面對相似的面試題目或者問題,雖然涉及的知識點(子查詢、鏈接查詢等)不是不少,可是由於有一些數據的轉化和查詢的嵌套,可能會形成一些心理素質較差的讀者手足無措。所以,面對相似的複雜問題,要學會使用「拆分法」進行分解,一步步地解決問題。

       祝你成功!

 

原文地址:http://blog.csdn.net/sinat_26342009/article/details/45674121

相關文章
相關標籤/搜索