SQL語句SELECT TOP用法小結 轉)

2021-04-21 08:48:44 字數 1757 閱讀 7451

今天很是鬱悶,因為我以下的這些文字是第二次打入,艾,斷線,提交失敗,資料清空 ,看來要改進我的後台系統了……

近些時間來,我也發現一些細節問題。有不少使用者有意無意地在標題裡加上一些無意義的阿拉伯數字,我明白:這些使用者也同樣的遇到了重複資訊拒絕發布的困擾了,這樣做也是為了規避這樣的限制。結合今天的這位向我反應問題的使用者,我意識到:可能是我的程式判斷有誤了。

馬上本地localhost測試,果然,我發布了一條3個月前的標題相同的資訊,系統也提示重複資訊,拒絕發布;而這個3個月前的id數字距現在有2萬多了的差距了,遠遠超出了我的select top 30的查詢了。

開啟**,資料庫為mssql 2000:

dim rs,sql

set rs = server.createobject ("adodb.recordset")

sql="select top 30 * from data where title='"&title1&"' order by id desc"

rs.open sql,conn,1,3

if rs.eof then

'入庫操作

else

'重複,拒絕發布

end if

上面的這段**是有錯誤的。它和我的原意相反。sql語句裡同時存在where和top語句的時候,

並且where條件列不是合適的索引,程式執行的是全表掃瞄,首先是查詢符合where條件的記錄,而這裡的top限制形同虛設。如果全表是百萬級別以上的資料表,那麼就這麼乙個簡單的判斷,就有可能拖垮資料庫。

我們可以採用變通的方法,就是去掉sql查詢裡的where條件,放入到迴圈體內做判斷;比如採用

piaoyi

以下這樣的**:

dim rs,sql,cf

cf=0 '初始化重複標識為0

set rs = server.createobject ("adodb.recordset")

sql="select top 30 * from data order by id desc"

rs.open sql,conn,1,3

do while not rs.eof

if rs("title")=title1 and datediff("h",rs("time"),now())<24 then

'標題相同,且在24小時內發帖

cf=1 ''重複標識為1

exit do

end if

rs.movenext

loop

if cf=0 then

'入庫操作

elseif cf=1 then

'拒絕發布重複資訊

end if

如果你希望使用selcet top語句,並且還要附帶where條件,那麼條件中的列就得是合適的索引,如聚集索引、復合索引裡的主列等,同時,where條件裡也要盡量避開使用函式,or,判斷null等會引起全部掃瞄的語句。這一點要記住,不然執行的是全表掃瞄。

另外,也有人問道,如何選出第n條到第2n條記錄呢。這樣的sql語句就可以了:

「select top n * from table_name where id not in (select top n id from table_name order by id desc) order by id desc」。

乙個小的細節問題,如果不注意的話,有可能拖累整個程式的穩定性、健壯性;當資料量不大的時候,這種影響可能感覺不出來,而當資料量達到一定的程度的時候,比如有100人同時進行插入資料的操作時,系統很有可能假死,iis崩潰掉。而這,不是我希望看到的。

小心 SQL語句SELECT TOP 的用法

近些時間來,我也發現一些細節問題。有不少使用者有意無意地在標題裡加上一些無意義的阿拉伯數字,我明白 這些使用者也同樣的遇到了重複資訊拒絕發布的困擾了,這樣做也是為了規避這樣的限制。結合今天的這位向我反應問題的使用者,我意識到 可能是我的程式判斷有誤了。馬上本地localhost測試,果然,我發布了一...

用SQL語句運算元據

語法 insert into 表名 列名列表 values 值列表 insert into 表名 列表名1,列表名2,列表名3,列表名4 select 值列表1,值列表2,值列表3,值列表4 from 插入的表名 select 列表名1,列表名2,列表名3,列表名4 into addresslist...

經典SQL語句(case when then)用法

有一張表,裡面有3個字段 語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來 並寫出您的思路 大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。顯示格式 語文 數學 英語 及格 優秀 不及格 sql ...