請問~如何做缺號查詢 |
答題得分者是:AndrewK
|
typer486
一般會員 發表:9 回覆:16 積分:5 註冊:2008-11-26 發送簡訊給我 |
|
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
若苻合以下條件可以參考【如何壓縮 access 資料庫】,重整索引即可
1.id 項目為流水號欄位 2.資料庫不為多人使用 (通常 access 資料庫都建議於單機單人使用) 若是僅僅查詢1~10000筆資料中是否有缺號,加上 id 數字一定不會重覆的情況下 可以利用 sql 語法 select count(*) as result from 產品id where id between 1 and 10000 來判斷result 欄位是否為 10000 ===================引 用 typer486 文 章=================== 請教各位先進因小弟在資料庫領域還在摸索階段,因此有些資料庫語法還不是很熟悉希望大家多多指教!小弟目前用ADO連接MS Access的資料庫遇到一個問題是我的資料庫裡面有"產品ID"的項目且ID的數字從1~16777215筆資料且不得重複,假設如果小弟要查詢1~10000筆資料中是否有缺號該如何寫呢?謝謝
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
typer486
一般會員 發表:9 回覆:16 積分:5 註冊:2008-11-26 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
以上各位大大的解法當然是 直觀而且可行 的方法,
我想, 答案並不一定是唯一解, 在此我提供一個用 SQL 命令的方向供您參考 假設您可先建一個 VIEW, 目的在取得 record_number rno. CREATE OR REPLACE VIEW public.vwtest AS SELECT id, (SELECT Count(*) FROM prod C WHERE C.ID <= prod.ID) AS rno FROM prod ORDER BY prod.id; 又假設 ID 為數值型欄位, 那可以用 SQL 的方式取得 斷號區間 如下 select id_a 1 as id_bgn, id_b-1 as id_end from ( select a.id id_a, b.id id_b from vwtest as a, vwtest as b where a.rno = b.rno-1 ) where id_a<>id_b-1 實際上我是用 oracle 測, 可行. sql 如下, 其中, with 命令就像建 VIEW 一樣功能. with tmp as (select id, rownum rno from (select 1 id from dual union select 2 from dual union select 4 from dual union select 6 from dual) order by id) select id_a 1, id_b-1 from ( select a.id id_a, b.id id_b from tmp a, tmp b where a.rno=b.rno-1 ) where id_a<>id_b-1 參考一下
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
假設 id 為 1~10000 之連續資料,且 id 數字一定不會重覆的情況下
1.可以利用 sql 語法 select id from 產品id where id between 1 and 10000 order by id 利用程式跑迴圈,並將缺號顯示於 memo TAdoquery 的名稱:adoquery1 Tmemo1的名稱:memo1 資料庫:Access 大致邏輯如下,例外錯誤的預防就由你來加囉~~ procedure CheckNumberContinue( End_Num : integer); var i : integer; begin memo1.lines.clear; i := 1; while i <= End_Num do begin if adoquery1.filedByName("ID").Value = i then adoquery1.Next; i else begin memo1.lines.add(adoquery1.filedByName("ID").Asstring); i end; end; 沒測試過,你可以試試看~~~
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
typer486
一般會員 發表:9 回覆:16 積分:5 註冊:2008-11-26 發送簡訊給我 |
AnderwK大
我用BCB改寫成 void __fastcall TFrm_PB2Tally::Button1Click(TObject *Sender) { int i; Memo1->Lines->Clear(); i = 1; while (i<=1000) { if (ADOQuery1->FiledByName("產品編號")->Value = i) { ADOQuery1->Next(); i ; } else { Memo1->Lines->Add(ADOQuery1->FiledByName("產品編號")->AsString); i ; } } } 可是出現 [C Error] Main_PB2Tally.cpp(77): E2316 'FiledByName' is not a member of 'TADOQuery' 請問BCB 的 ADOQuery是沒有這個語法嗎? ===================引 用 AndrewK 文 章=================== 假設 id 為 1~10000 之連續資料,且 id 數字一定不會重覆的情況下 1.可以利用 sql 語法 select id from 產品id where id between 1 and 10000 order by id 利用程式跑迴圈,並將缺號顯示於 memo TAdoquery 的名稱:adoquery1 Tmemo1的名稱:memo1 資料庫:Access 大致邏輯如下,例外錯誤的預防就由你來加囉~~ procedure CheckNumberContinue( End_Num : integer); var i : integer; begin memo1.lines.clear; i := 1; while i <= End_Num do begin if adoquery1.filedByName("ID").Value = i then adoquery1.Next; i else begin memo1.lines.add(adoquery1.filedByName("ID").Asstring); i end; end; 沒測試過,你可以試試看~~~ |
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
|
typer486
一般會員 發表:9 回覆:16 積分:5 註冊:2008-11-26 發送簡訊給我 |
[code cpp]
#include #pragma hdrstop #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFrm_Tally *Frm_Tally; long count; //--------------------------------------------------------------------------- // 用 ADO 壓縮 Access 資料庫 void CompactDatabase(String f1, String psw1, String f2, String psw2) { String Provider1="Provider=Microsoft.Jet.OLEDB.4.0" ";Data Source=" f1 ";Jet OLEDB:Database Password=" psw1; String Provider2="Provider=Microsoft.Jet.OLEDB.4.0" ";Data Source=" f2 ";Jet OLEDB:Database Password=" psw2; Variant Adoobj=Variant::CreateObject("JRO.JetEngine"); Adoobj.OleProcedure("CompactDatabase",Provider1.c_str(),Provider2.c_str()); Adoobj.Clear(); ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select * from 產品資料表"); ADOQuery1->SQL->Add("where 產品編號 >=0 and 產品編號 <=0"); ADOQuery1->Prepared = true; ADOQuery1->Open(); } //--------------------------------------------------------------------------- __fastcall TFrm_Tally::TFrm_Tally(TComponent* Owner) : TForm(Owner) { appPath = ExtractFilePath(Application->ExeName); // 取得執行文件的路徑 ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=" appPath "PRODUCTINFO.mdb"; // 連結 Access 資料庫檔案 ADOConnection1->Connected = true; DS->Active = true; } //--------------------------------------------------------------------------- void __fastcall TFrm_Tally::btn_LackInquiryClick(TObject *Sender) { // Access壓縮重整 ADOConnection1->Connected = false; String f1= "PRODUCTINFO.mdb"; // 源庫1 String psw1= ""; // 密碼1 String f2= "PRODUCTINFO2.mdb"; // 新目的庫2 String psw2= ""; // 新密碼2 String dir=ExtractFilePath(Application->ExeName); f1=dir f1; f2=dir f2; if (FileExists(f2)) // 不允許目的庫存在 DeleteFile(f2); CompactDatabase(f1,psw1,f2,psw2); //ShowMessage("Finished"); if ( lbledt_ID_up->Text != "" && lbledt_ID_low->Text != "" ) { ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select 產品編號 from 產品資料表"); ADOQuery1->SQL->Add("where 產品編號 between ID_low and ID_up order by 產品編號"); ADOQuery1->Parameters->ParamByName("ID_low")->Value = lbledt_ID_low->Text.ToInt(); ADOQuery1->Parameters->ParamByName("ID_up")->Value = lbledt_ID_up->Text.ToInt(); ADOQuery1->Prepared = true; ADOQuery1->Open(); int i; Memo1->Lines->Clear(); i = 1; while (i<=lbledt_ID_up->Text) { if (ADOQuery1->FieldByName("產品編號")->Value == i) { ADOQuery1->Next(); i ; } else { Memo1->Lines->Add(ADOQuery1->FieldByName("產品編號")->AsString); i ; } } } else { Application->MessageBox("請輸入查詢數字範圍!!", "PB2 ID 缺號查詢"); } } //--------------------------------------------------------------------------- void __fastcall TFrm_Tally::FormClose(TObject *Sender, TCloseAction &Action) { lbledt_ID_low->Text = ""; lbledt_ID_up->Text = ""; DBGrid1->DataSource = DataSource2; ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select * from 產品資料表"); ADOQuery1->SQL->Add("where 產品編號 >=0 and 產品編號 <=0"); ADOQuery1->Prepared = true; ADOQuery1->Open(); DS->Close(); } //--------------------------------------------------------------------------- [/code] 各位先進以上是我試的程式碼,因為都試不出缺號的部分所以希望各位先進幫我看看指教...謝謝
編輯記錄
typer486 重新編輯於 2009-06-22 09:11:11, 註解 無‧
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
去建一個全部都有的 table
id = 0, 1,2,3,.......n 然後用 join 的方法去處理.就可以找出誰沒出現了. ===================引 用 typer486 文 章=================== 請教各位先進因小弟在資料庫領域還在摸索階段,因此有些資料庫語法還不是很熟悉希望大家多多指教!小弟目前用ADO連接MS Access的資料庫遇到一個問題是我的資料庫裡面有"產品ID"的項目且ID的數字從1~16777215筆資料且不得重複,假設如果小弟要查詢1~10000筆資料中是否有缺號該如何寫呢?謝謝 |
AndrewK
高階會員 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
建議在挑出 缺號 前 先利用程式,檢查資料是否重覆 亦可將資料 group by 後 再進行條件範圍限制 (between) 及將資料排序
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-06-22 15:27:01, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |