Oracle資料庫 兩個重要的資料偽列 12

2021-08-28 22:22:33 字數 2568 閱讀 3349

在之前使用過的sysdate,這個列雖然沒有在表中定義,但是卻可以使用,除了這個,還有兩個非常重要的偽列

:rownum,rowid

rownum是乙個在查詢之中可以根據資料行自動生成的乙個行標記偽列

範例:觀察rownum使用

select rownum ,empno,ename,job,deptno,sal from emp;

rownum這個列原本就不在emp表之中,但是由於其是偽列,所以可以直接查詢,執行之後發現隨著資料行的累加,rownum可以自動的進行

行號的累加,但是必須強調的是rownum並不是固定的,是在動態生成的,而oracle之中使用rownum可以實現兩個功能:

功能一:取得第一行記錄

功能二:取得前n行記錄

範例:取得第一行記錄

select rownum ,empno,ename,job,deptno,sal from emp where rownum=1 and deptno=10;

範例二:取得前n行記錄

select rownum ,empno,ename,job,deptno,sal from emp where rownum<10;

但是需要記住的是,rownum本身並沒有提供取得指定範圍行的功能。

因為rownum屬於動態生成

範例:錯誤的應用

select rownum ,empno,ename,job,deptno,sal from emp where rownum between 6 and 10;

如果想取得正確指定範圍行的記錄,則必須使用子查詢,例如:以上一例的要求,取得6到10行

先要取得前10行記錄,而後再通過前10行取得裡面的後五行記錄

所以現在可以有如下的乙個變數代入

select * from(

select rownum rn,empno,ename,job,deptno,sal from emp where

rownum<=10) temp                            =<10=currentpage*linesize

where temp.rn>5;                                 =<5=(currentpage-1)*linesize

範例:取得前5條

這個前時候有兩種寫法,一種就是直接取得5條(語法上沒錯,但不通用)

select rownum ,empno,ename,job,deptno,sal from emp where rownum<=5;

currentpage=1    linesize=5

select * from(

select rownum rn,empno,ename,job,deptno,sal from emp where rownum<=5) temp   

where temp.rn>0;

select * from(

select rownum rn,列,列,列...

from 表名稱

where rownum.rn<(currentpage* linesize) 

where temp.rn>((currentpage-1)* linesize);

行id:rowid(了解)

範例:觀察rowid

select rowid,deptno,dname,loc from dept;

發現這個時候每行資料的rowid不同,它包含如下的幾個組成部分

資料物件號:aaar3q

相對檔案號:aae

資料塊號:aaaach

資料塊號:aaa

範例:將dept複製為mydept

create table mydept as select * from dept;

由於資料庫設計不嚴謹,加入重複的資料,使用delete語句刪除,會把兩行資料被刪除

所以用rowid來刪除

此種方式是作為唯一的實體地址標識使用的。

面試題:現在的mydept表由於最早設計的問題,導致裡面大量的重複資料

要求:通過一條語句刪除所有重複資料,保留最早的資料

範例:編寫語句

第一步,繼續使用分組,統計出所有最早的rowid(要保留的)

select min(rowid)

from mydept

group by deptno,dname,loc;

第二步:保留以上的rowid

delete from mydept

where rowid not in(

select min(rowid)

from mydept

group by deptno,dname,loc);

一台機器,兩個Oracle資料庫,兩個SDE服務!

伺服器上安裝了oracle11g和sde10,通過arcdigrammer匯入的資料庫模型,經常出問題,arccatalog經常莫名其妙的就崩潰了!執行一段時間,有的人以sde使用者建立的表看不到,後來通過oracle進去刪除這些表之後,就再也不能通過arccatalog進行增加和刪除表了,彈出表或...

Oracle 兩個資料庫之間相同表結構的資料匯入

今天在我本地資料庫遇到某乙個表的資料出現了錯誤,於是就想重新把伺服器上的該錶資料down到本地,於是就想起來用了這個方法 第1步 在a資料庫中建立dblink 鏈結到b sqlplus create database link dblink name connect to user identifi...

兩個庫同步更新資料庫

我做的是2個資料庫的乙個備份同步更新,因為備份資料庫有字段的冗餘增加,所以不能完全bulkcopy這樣的同步,需要進行乙個修改再同步更新,具體修改 不展示出來了,下面貼更新 開始的時候,使用如下 進行更新 using var conn new sqlconnection fromconn int u...