喝咖啡的企鵝

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

          Oracle表查詢(2)

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

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

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

          笨辦法:利用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;

          分頁查詢
          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表補償增加ROWNUM列,并A表ROWID列建立新表,并加分頁行上限值限制選取最高行數,另命名為B表;
          c-從B表選擇ROWID,并加分頁行下限值選取最低行數,獲得分頁行的ROWID表;
          d-比較c步驟的ROWID表,從table選出相應行,排序,分頁。
          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排序,并在最后補償ROWNUM列建立新表,另命名為A表;
          b-從A表選取rn在所取行數范圍內的行,分頁。
          一般:利用ROWID效率比利用ROWNUM高。
          主站蜘蛛池模板: 湄潭县| 交城县| 德兴市| 通州区| 灵石县| 马尔康县| 金川县| 绩溪县| 阿坝| 台北县| 寿宁县| 延津县| 皮山县| 馆陶县| 冀州市| 辽中县| 济宁市| 三穗县| 资源县| 裕民县| 襄汾县| 东港市| 昌吉市| 三穗县| 白河县| 恩平市| 金山区| 沂水县| 五大连池市| 德保县| 城步| 和平县| 隆化县| 珠海市| 富川| 青冈县| 三明市| 涟源市| 弥勒县| 东乌| 津南区|