當須要對查詢到的結果進行比較複雜的處理的時候,能夠藉助聯合查詢、子查詢等獲得指望的結果。下面列舉一個具體的經典試題,但願對讀者有所啓發。面試
表 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 2010code
這道題目能夠分解爲兩步:blog
第一步:找出全部連續得到冠軍的球隊ip
第二it
步table
:計算
連續得到冠軍的球隊的起止年份
-- Create table create table NBA ( team NUMBER, year NUMBER ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited );爲了方便起見,這裏僅用數字代替球隊,隨意插入一些測試數據:
活塞 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執行結果爲:
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 ;下面是最終的執行結果:
面對相似的面試題目或者問題,雖然涉及的知識點(子查詢、鏈接查詢等)不是不少,可是由於有一些數據的轉化和查詢的嵌套,可能會形成一些心理素質較差的讀者手足無措。所以,面對相似的複雜問題,要學會使用「拆分法」進行分解,一步步地解決問題。
祝你成功!
原文地址:http://blog.csdn.net/sinat_26342009/article/details/45674121