喝咖啡的企鵝

          先做事情,再看心情……
          posts - 16, comments - 0, trackbacks - 0, articles - 0

          Oracle表查詢(2)

          Posted on 2009-11-30 12:16 咖啡企鵝 閱讀(199) 評(píng)論(0)  編輯  收藏 所屬分類: SQL

          多表查詢一般表達(dá)式:
          SELECT ...tx.cu,...FROM table1 t1,table2 t2,...tablen tn WHERE conditions;...--(conditions.count>=n-1)
          首先確定要查詢的字段以及要求條件字段會(huì)出現(xiàn)在那些表中,從而甄選出table1到tablen共n張表;
          為表起個(gè)別名(非必須),表名.字段 方式限定查詢字段;
          分析歸納出限定條件(重點(diǎn)難點(diǎn)),不會(huì)少于n-1個(gè);
          最后,有其他要求,如排序,酌情添加。

          自連接查詢:
          例表:SQL> desc emp;
          Name     Type         Nullable Default Comments
          -------- ------------ -------- ------- --------
          EMPNO    NUMBER(4)    --職員編號(hào)                         
          ENAME    VARCHAR2(10) Y                        
          JOB      VARCHAR2(9)  Y                        
          MGR      NUMBER(4)    Y         --上級(jí)編號(hào)               
          HIREDATE DATE         Y                        
          SAL      NUMBER(7,2)  Y                        
          COMM     NUMBER(7,2)  Y                        
          DEPTNO   NUMBER(2)     
          問(wèn)題:查詢職員姓名,職員編號(hào),職員上級(jí)姓名,職員上級(jí)編號(hào);

          笨辦法:利用SELECT造出另一張表
          SELECT emp.ename,emp.empno,empx.ename,empx.empno FROM emp,(SELECT empno,ename FROM emp) empx WHERE emp.mgr = empx.empno;
          好辦法:利用別名造出另一張表
          SELECT cl.ename,cl.empno,ld.ename,ld.empno FROM emp cl,emp ld WHERE cl.mgr=ld.empno;

          分頁(yè)查詢
          1.利用ROWID
          SELECT * FROM table WHERE ROWID IN (SELECT B.rid FROM (SELECT ROWNUM rn,A.rid FROM (SELECT ROWID rid FROM table ORDER BY tdid) A WHERE ROWNUM<=16380) B WHERE B.rn>=16351) ORDER BY tdid;
          a-先按照tdid排序從table中選取ROWID表,另命名為A表;
          b-從A表補(bǔ)償增加ROWNUM列,并A表ROWID列建立新表,并加分頁(yè)行上限值限制選取最高行數(shù),另命名為B表;
          c-從B表選擇ROWID,并加分頁(yè)行下限值選取最低行數(shù),獲得分頁(yè)行的ROWID表;
          d-比較c步驟的ROWID表,從table選出相應(yīng)行,排序,分頁(yè)。
          2.利用ROWNUM
          SELECT * FROM (SELECT table.*,ROWNUM rn FROM table ORDER BY tdid DESC) A WHERE A.rn BETWEEN 16351 AND 16380;
          a-選取table所有列,按照tdid排序,并在最后補(bǔ)償ROWNUM列建立新表,另命名為A表;
          b-從A表選取rn在所取行數(shù)范圍內(nèi)的行,分頁(yè)。
          一般:利用ROWID效率比利用ROWNUM高。
          主站蜘蛛池模板: 新巴尔虎左旗| 仙居县| 高碑店市| 徐水县| 惠安县| 侯马市| 石柱| 鹤山市| 常宁市| 辉南县| 元阳县| 金平| 团风县| 高陵县| SHOW| 辽中县| 抚顺县| 锡林浩特市| 崇左市| 洛扎县| 宿州市| 武安市| 志丹县| 连平县| 含山县| 滦平县| 双桥区| 尉氏县| 邯郸市| 始兴县| 海城市| 南川市| 乌拉特前旗| 贡山| 达孜县| 黄冈市| 大邑县| 涿州市| 翼城县| 松江区| 泗阳县|