1. oracle和sql server取第一條記錄的區別以及rownum詳解
我們知道學生可能有重名的情況,那麼當重名的時候假設只需要取得重名結果集中的第一條記錄。
sql server:
select top(1) num,Name from M_Student where name = 'xy'
Oracle:
select num,Name from M_Student where name = 'xy' and rownum <= 1
對於rownum在oracle的使用的時候,有幾點需要注意:
(1) rownum 對於等於某值的查詢條件
如果希望找到學生表中第一條學生的信息,可以使用rownum=1作為條件。但是想找到學生表中第二條學生的信息,使用rownum=2結果查不到數據。因為rownum都是從1開始,但是1以上的自然數在rownum做等於判斷是時認為都是false條件,所以無法查到rownum = n(n>1的自然數)。
(2) rownum對於大於某值的查詢條件
如果想找到從第二行記錄以後的記錄,當使用rownum>2是查不出記錄的,原因是由於rownum是一個總是從1開始的偽列,Oracle 認為rownum> n(n>1的自然數)這種條件依舊不成立,所以查不到記錄。
(3) rownum對於小於某值的查詢條件
rownum對於rownum<n(n>1的自然數)的條件認為是成立的,所以可以找到記錄。比如 rownum < 3
(4) rownum和排序
Oracle中的rownum的是在取數據的時候產生的序號,所以想對指定排序的數據去指定的rowmun行數據就必須注意了。
select rownum ,id,name from student order by name;
ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 張一
4 200004 趙四
可以看出rownum並不是按照name列來生成的序號。系統是按照記錄插入時的順序給記錄排的號,rowid也是順序分配的。必須使用子查詢。
select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 張一
4 200004 趙四
這樣就成了按name排序,並且用rownum標出正確序號(由小到大)
看一個例子
把最先進入公司的5個人找出來
方法一 SELECT * FROM emp WHERE ROWNUM <= 5 ORDER BY hiredate;
方法二 SELECT * FROM(SELECT * FROM emp ORDER BY hiredate) WHERE ROWNUM <= 5;
把最先進入公司的6-10個人找出來
方法一
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 10
MINUS
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 5;
方法二(分頁常用)
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) t WHERE t.rn >= 6;
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6;
2. 跪求一句SQL代碼(Oracle Rownum)
select b.nn,a.CoustmerID ,a.OrderID
from 訂單表 a,
(select c.CoustmerID,rownum as nn from 客戶表 c) b
where a.CoustmerID = b.CoustmerID
其實只要把客戶表中的CoustmerID 和rownum查出了,做為結果集聯合訂單表就可以了
-------------------上面的語句我用其他表試了,沒有問題
想知道你是oracle資料庫嗎?
還是其他資料庫,想做到oracle的rownum效果?
3. oracle資料庫中表的第一列是不是rownum
oracle 中的 rownum 是偽列,不屬於某一張表。
對於rownum來說它是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個偽欄位可以用於限制查詢返回的總行數,而且rownum不能以任何錶的名稱作為前綴。
所以它更不是表中的第一列。
4. sql中有沒有類似於oracle中rownum的函數
SQL Server 2000中沒有SQL Server 2005中有一個ROW_NUMBER()函數實現了相同的功能 ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> ) 參數 <partition_by_clause> 將 FROM 子句生成的結果集劃入應用了 ROW_NUMBER 函數的分區。有關 PARTITION BY 的語法,請參閱 OVER 子句 (Transact-SQL)。 <order_by_clause>確定將 ROW_NUMBER 值分配給分區中的行的順序。有關詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。當在排名函數中使用 <order_by_clause> 時,不能用整數表示列。 返回類型 bigint 備注 ORDER BY 子句可確定在特定分區中為行分配唯一 ROW_NUMBER 的順序。 參考: http://msdn.microsoft.com/zh-cn/library/ms186734(SQL.90).aspx
5. 關於oracle中使用rownum的問題
除了索引組織表(IOT),其他的表存儲都是堆表(Heap表)是無序的,查詢出的數據不一定就是入庫順序,切記
所以 用rownum 最好加上order by
解決方案:
查詢:
select * from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
刪除:
delete from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
這里按照id 排序,因為id是有索引的,索引本身就是有序的,所以 order by id 不會產生性能問題
6. SQL中ROWNUM是做什麼的有什麼作用
ORACLE中,ROWNUM像一個隱藏的欄位。記錄的是行數。
SELECT ROWNUM,A.* FROM TABLE A 就出來了
可以查第幾條數據,如:
select * from (SELECT ROWNUM rn,A.* FROM TABLE A )b where b.rn=你要查詢的行數
7. sql中有沒有類似於oracle中rownum的函數
Oracle
row_number()函數用法
row_number()over(partition
by
col1
order
by
col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)。
與rownum的區別在於:使用rownum進行排序的時候是先對結果集加入偽劣rownum然後再進行排序,而此函數在包含排序從句後是先排序再計算行號碼。
row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開始排序)。
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)
dense_rank()也是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復值的。
oracle
分析函數
row_number(),返回一個整數值(>=1);
語法格式:
row_number()
over
(order
by
col_1[,col_2
...])
作用:按照col_1[,col_2
...]排序,返回排序後的結果集。
8. Oracle資料庫rownum和row_number的不同點
明確對於rownum
來說它是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是二,以此類推,這個為欄位可以用於限制查詢的返回的總行數,因為rownum總是從1開始,但是1以上的自然數在rownum
做等於判斷時都認為是false
條件,所以無法查到
rownum=n
(n》1的自然數),所以查找第二行以後的記錄可以用子查詢方法來解決,給子查詢中的rownum取別名;對於小於某個值的情況兩種方法都差不多,但是對於某個不等於一的值或者求某個值到某個值之間的情況,用row_number()
別名獲得排名
,比用rownum偽列要簡單方便的多;因為偽列總是從一開始查找;
具體用法和區別參見以下代碼;
--取出工資最高的前5位
select
empno,ename,sal,rownum
from
emp;
select
*
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=5;
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num<=5;
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
from
emp)
where
rownum<=5
--工資的前3名
select
*
from
emp
where
sal
>=any(select
*
from
(select
sal
from
emp
order
by
sal
desc)
where
rownum<=3);
select
*
from(select
*
from
emp
order
by
sal
desc)
where
rownum
<4;
select
*
from
(select
ename,sal,empno,deptno
,row_number()
over
(order
by
sal
desc)
from
emp)
where
rownum<4;
select
*
from
(select
ename,sal,empno,deptno
,row_number()
over
(order
by
sal
desc)
as
num
from
emp)
where
num<4
--按照工資排序,取出第6名到第10名
--使用偽列獲得
select
*
from
(select
ename,sal,rownum
r
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=10)
where
r>5;
--使用排名函數獲得
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num>5
and
num<=10;
-------
按工資從高到低獲得工資排名第四的員工
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num=4;
select
*
from
(select
ename,sal,rownum
r
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=4)
where
r=4;
總結oracle中rownum和row_number()的區別
row_number()是分析函數,基本語法為row_number()
over(partition
by
欄位
order
by
欄位)
rownum是一個偽列
select
*
from
dept
where
rownum<=3;
select
*
from
dept
where
rownum
between
2
and
3;這兒會出錯,因為rownum的特性(沒有1就不會有2,沒有3)決定的
SELECT
*
FROM
(SELECT
A.*,ROWNUN
FROM
DEPT
A)T1
WHERE
T1.ROWNUM
BETWEEN
2
AND
3;這么寫不對,要這樣寫
SELECT
*
FROM
(SELECT
A.*,ROWNUM
RN
FROM
DEPT
A)T1
WHERE
T1.RN
BETWEEN
2
AND
3;
他們的主要區別是:使用rownum進行排序的時候是先對結果集加入偽列rownum然後再進行排序,而函數row_number()在包含排序從句後是先排序再計算行號碼。
9. oracle的sql 以下rownum=1 怎麼換成db2的寫法
select t.* from (select CASH_ID,row_number() over() as rown from
STL_FIN_PRODUCT_ACCT ,fin_proct
where STL_FIN_PRODUCT_ACCT.FINPROD_ID = fin_proct.finprod_id
and fin_proct.p_finprod_id = STL_FIN_PRODUCT_ACCT.FINPROD_ID
and STL_FIN_PRODUCT_ACCT.ACCT_NO = STL_FIN_PRODUCT_ACCT.ACCT_NO
and STL_FIN_PRODUCT_ACCT.ACCT_TYPE = STL_FIN_PRODUCT_ACCT.ACCT_TYPE
and CASH_ID is not null
) t where t.rown = 1
10. oracle中使用rownum分頁,請教一下數據的順序會變嗎
第一次的rownum是oracle中的一個虛擬列你說的rn是給這個rownum起的別名,也就是在子查詢中的別名要在外查詢中調用oracle中的分頁查詢不止是只有rownum還可以用row_number等函數(不過這個是根據某個欄位排序後的排名,這個在數據量較大的情況下很影響查詢效率),不過這個的調用方式也跟上邊的那個類似,並且,這個row_number函數在sqlserver中也是可以使用的,具體的你可以搜索一下