請教 ADOQuery 限制(刪除多餘)資料筆數的 SQL 語法問題 |
尚未結案
|
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
請教一下 程式碼編寫方法
目前本人可以使用較笨的方法將Data內某些資料複製到其他地方,
再將原先資料庫清除後,然後將原先複製到其他地方的資料copy 回來
請教各位先進,是否有較輕鬆的程式語法 一段 就可以解決了? 原來語法:
//--------------------------------------------------------------
ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add( "Select Top 100 * into newTable from Work_Data order by Work_Data.Index Desc"); //刪除 ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add( "Delete * from Work_Data "); //複製 ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add( "Select * into Work_Data from newTable"); //刪除 ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add( "Delete * from newTable");謝謝各位的協助. 練習! 練習! 再練習!
------
嘿嘿嘿 |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
|
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
|
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
|
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add("set ROWCOUNT 10 ;"); ADOQuery_WorkData->SQL->Add("Delete from Work_Data order by Work_Data.Index asc;"); ADOQuery_WorkData->SQL->Add("set ROWCOUNT 0 ;"); ADOQuery_WorkData->Active = false ; ADOQuery_WorkData->Active = true ;異常訊息為" 無效的SQL陳述式,預期為'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE' " 練習! 練習! 再練習!
------
嘿嘿嘿 |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add("set ROWCOUNT 10 ;"); ADOQuery_WorkData->SQL->Add("Delete from Work_Data order by Work_Data.Index asc;"); ADOQuery_WorkData->SQL->Add("set ROWCOUNT 0 ;"); |
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
|
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
這是我自己測試的程式,粗體字部分就是您要留下來多少筆資料:
void __fastcall TForm1::Button1Click(TObject *Sender) { ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select count(*) as cnt from Work_Data"); ADOQuery1->Open(); int cnt = ADOQuery1->FieldByName("cnt")->AsInteger; ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("set ROWCOUNT " IntToStr(cnt - 100)); ADOQuery1->SQL->Add("delete from Work_Data"); ADOQuery1->SQL->Add("set ROWCOUNT 0"); ADOQuery1->ExecSQL(); }P.S 不好意思我疏忽了,Delete from 沒有 Order by 可以用。 |
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
|
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
|
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
我後來覺得這樣下比較好,可是 Access 不知道有沒有支援 Top 的語法?
void __fastcall TForm1::Button1Click(TObject *Sender) { ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select count(*) as cnt from Work_Data"); ADOQuery1->Open(); int cnt = ADOQuery1->FieldByName("cnt")->AsInteger - 100; cnt = cnt >= 0 ? cnt : 0; ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("delete from Work_Data"); ADOQuery1->SQL->Add(" where Work_Data.Index <= "); ADOQuery1->SQL->Add(" ("); ADOQuery1->SQL->Add(" select Top " IntToStr(cnt)); ADOQuery1->SQL->Add(" max(Work_Data.Index) as MaxIdx"); ADOQuery1->SQL->Add(" from Work_Data"); ADOQuery1->SQL->Add(" group by Work_Data.Index"); ADOQuery1->SQL->Add(" order by Work_Data.Index asc"); ADOQuery1->SQL->Add(" )"); ADOQuery1->ExecSQL(); }發表人 - allenchan 於 2004/12/15 22:54:39 |
無故障
一般會員 發表:17 回覆:69 積分:17 註冊:2004-03-11 發送簡訊給我 |
感謝您的協助
昨晚找到以前上課過的SQL 書籍,重新ReView
終於被我測試出來可應付 Access 檔案要求的語法 如下
//目標:保留最後(新) ? 筆資料 ADOQuery_WorkData->SQL->Clear() ; ADOQuery_WorkData->SQL->Add( "Delete from Work_Data "); ADOQuery_WorkData->SQL->Add( "where Work_Data.Index not in ( Select Top 10 Work_Data.Index from Work_Data order by Work_Data.Index Desc );"); ADOQuery_WorkData->ExecSQL();供各位參考,謝謝 練習! 練習! 再練習!
------
嘿嘿嘿 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |