真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

包含postgresql偽列的詞條

gp里用什么代替oracle里rownum,用什么代替rowid???

無法代替,也是數(shù)據(jù)庫本身的限制。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比南樂網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南樂網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南樂地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

1,oracle的rowid在普通表中是能唯一標(biāo)記一行記錄,可以快速定位。

2,在Postgresql中有一個(gè)與rowid差不多的就是oid,但這個(gè)默認(rèn)沒有的 ,要在建表的時(shí)候指定with oids才有。這個(gè)也可以唯一標(biāo)記并快速定位行記錄。

3,在GREENPLUM中,一個(gè)OID確實(shí)是可以找到多行,這是因?yàn)镚REENPLUM是由多個(gè)INSTANCE組成的。

mysql 類似oracle parallel的多線程查詢

1)查詢表中的前8條記錄

select * from area where rownum = 8

查詢結(jié)果如下:

2)查詢第2到第8條記錄

對(duì)于這種形式的查詢,oracle不像mysql那么方便,它必須使用子查詢或者是集合操作來實(shí)現(xiàn)。我們可以使用以下3種方式可以實(shí)現(xiàn):

A: select id,province,city,district from (select id,province,city,district,rownum as num from area) where num between 2 and 8;

首先根據(jù)select id,province,city,district,rownum as num from area得到一個(gè)臨時(shí)表,這個(gè)臨時(shí)表中有一個(gè)rownum列(一個(gè)偽列,類似與rowid,但又不同于rowid,因?yàn)閞owid是物理存在的一個(gè)列,也就是說Oracle數(shù)據(jù)庫中任何一個(gè)表都有一個(gè)rowid列,而rownum不是物理存在的),然后在臨時(shí)表中來查詢。

B: select * from area where rownum = 8 minus select * from area where rownum 2;

使用集合減運(yùn)算符minus,該操作返回在第一個(gè)select中出現(xiàn)而不在第二個(gè)select中出現(xiàn)的記錄。

C: select id,province,city,district from (select id,province,city,district,rownum as num from area) where num =2

intersect

select * from area where rownum = 8;

使用集合交運(yùn)算符intersect,這里繞了一個(gè)彎(不過這個(gè)彎實(shí)現(xiàn)了rownum大于某個(gè)數(shù)的查詢),它是首先利用A的方式查詢得到所有rownum大于2的記錄,然后再與rownum小于等于8的記錄集合做交運(yùn)算。三種操作得到的結(jié)果一樣,如下圖所示:

3)rownum需要注意的問題

[1] rownum不支持以下方式的查詢

a: select * from area where rownum 2;

b: select * from area where rownum = n; –where n is a integer number lager than 1

注:rownum只支持select * from area where rownum =1的查詢。Oracle的官方文檔說明如下:

Conditions testing for ROWNUM values greater than a positive integer are always false.

For example, this query returns no rows:

SELECT * FROM employees

WHERE ROWNUM 1;

The first row fetched is assigned a ROWNUM of 1 and makes the condition false. The

second row to be fetched is now the first row and is also assigned a ROWNUM of 1 and

makes the condition false. All rows subsequently fail to satisfy the condition, so no

rows are returned.

因?yàn)閞ownum是根據(jù)查詢的結(jié)果集來對(duì)記錄進(jìn)行編號(hào),所以當(dāng)你查詢r(jià)ownum大于2的記錄時(shí)會(huì)得到一個(gè)空的結(jié)果集。因?yàn)楫?dāng)oracle查詢得到第1條記錄時(shí),發(fā)現(xiàn)rownum為1不滿足條件,然后就繼續(xù)查詢第2條記錄,但此時(shí)第2條記錄又被編號(hào)為1(也即rownum變?yōu)?),所以查詢得到的始終是rownum=1,因此無法滿足約束,最終查詢的結(jié)果集為空。

[2] rownum的排序查詢問題

Rownum的排序查詢是根據(jù)表中數(shù)據(jù)的初始順序來進(jìn)行的。Oracle官方文檔中說明如下:

If an ORDER BY clause follows ROWNUM in the same query, then the rows will be

reordered by the ORDER BY clause. The results can vary depending on the way the

rows are accessed. For example, if the ORDER BY clause causes Oracle to use an index

to access the data, then Oracle may retrieve the rows in a different order than without

the index.

例如:select * from area where rownum = 8 order by district;

其結(jié)果如下圖所示:

發(fā)現(xiàn)沒有,它只對(duì)area表中的前8條記錄進(jìn)行排序。那么,如果我要取表中的前8條記錄并且要求是全表有序,那怎么辦呢?還是老辦法,使用子查詢。我們可以使用以下語句得到:

select * from (select * from area order by district)

where rownum = 8;

查詢的結(jié)果如下圖所示:

結(jié)束語:

Oracle中的rownum與mysql的limit實(shí)現(xiàn)的功能相同,但沒有mysql來的容易,它一般通過一個(gè)子查詢來實(shí)現(xiàn)。mysql的易用性也是它能夠縱橫開源數(shù)據(jù)庫的原因,它不像postgresql那樣的學(xué)院派,它的那種簡(jiǎn)單易用性或許在大型軟件項(xiàng)目的開發(fā)中值得借鑒。最近聽說sql server 2008也實(shí)現(xiàn)了limit的查詢,不過還沒去試過,Oracle在這方面也要加油啊,用戶容易使用才是王道


文章題目:包含postgresql偽列的詞條
路徑分享:http://weahome.cn/article/dscscdc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部