喝咖啡的企鵝

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

          Oracle表查詢(2)

          Posted on 2009-11-30 12:16 咖啡企鵝 閱讀(197) 評論(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高。
          主站蜘蛛池模板: 尉氏县| 包头市| 长宁县| 托克逊县| 景泰县| 蛟河市| 金华市| 剑河县| 涿州市| 砀山县| 木兰县| 班戈县| 渝中区| 河池市| 凌云县| 应城市| 辽阳县| 布尔津县| 拉萨市| 砚山县| 金溪县| 朔州市| 合江县| 孟州市| 准格尔旗| 城市| 佛冈县| 通辽市| 营山县| 维西| 霍山县| 东莞市| 延长县| 灌南县| 郴州市| 景泰县| 嘉义市| 石景山区| 铁岭县| 忻州市| 九台市|