小心 SQL語句SELECT TOP 的用法

2021-04-18 11:48:31 字數 1599 閱讀 2475

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

馬上本地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條件的記錄,而這裡的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

end if

rs.movenext

loop

if cf=0 then

'入庫操作

elseif cf=1 then

'拒絕發布重複資訊

end if

如果你希望使用selcet top語句,就不要附帶where條件,這一點要記住,不然執行的是全表掃瞄。

另外,也有人問道,如何選出第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崩潰掉。而這,不是我希望看到的。

原始出處及本宣告。

mysql中sql優化小心得

1,以前用mysql不多,不過寫sql時都會考慮效率,主要是考慮先盡量篩選主表的資料。而今天寫了個sql,從幾十萬條資料中做累計,還要和其他表結合獲得使用者資訊,為了簡潔寫成如下形式 select c.name,sum a.cnt from a,b,c where a.id b.uid and a....

SQL語句 limit 語句

select from table limit offset,rows rows offset offset 在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql 已經為我們提供了上面這樣乙個功能。limit 子句可以被用於強制 select 語句返回...

SQL語句 UPDATE語句

update students set sname abcd gender 1 where sid 1 update students,students2 set students.sname students2.sname,students.gender students2.gender wher...