全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2812
推到 Plurk!
推到 Facebook!

請問~如何做缺號查詢

答題得分者是:AndrewK
typer486
一般會員


發表:9
回覆:16
積分:5
註冊:2008-11-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-10 08:24:52 IP:220.130.xxx.xxx 訂閱
請教各位先進因小弟在資料庫領域還在摸索階段,因此有些資料庫語法還不是很熟悉希望大家多多指教!小弟目前用ADO連接MS Access的資料庫遇到一個問題是我的資料庫裡面有"產品ID"的項目且ID的數字從1~16777215筆資料且不得重複,假設如果小弟要查詢1~10000筆資料中是否有缺號該如何寫呢?謝謝
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-14 02:47:53 IP:219.70.xxx.xxx 訂閱
若苻合以下條件可以參考【如何壓縮 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
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-06-14 02:53:44, 註解 無‧
AndrewK 重新編輯於 2009-06-15 02:56:08, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-06-15 13:00:03 IP:211.72.xxx.xxx 訂閱
是否有缺號, 如同樓上所言即可檢查.
缺的是那些號, 則需要用迴圈逐號檢查.
typer486
一般會員


發表:9
回覆:16
積分:5
註冊:2008-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-06-16 17:06:50 IP:59.120.xxx.xxx 訂閱
 herbert2 大大不好意思那如果要用迴圈該如何檢查呢?因為小弟試了很久還是無法成功!可否提供範例給小弟參考呢?感激不盡
===================引 用 herbert2 文 章===================
是否有缺號, 如同樓上所言即可檢查.
缺的是那些號, 則需要用迴圈逐號檢查.
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-06-17 14:39:09 IP:122.116.xxx.xxx 未訂閱
以上各位大大的解法當然是 直觀而且可行 的方法, 
我想, 答案並不一定是唯一解, 在此我提供一個用 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-06-19 22:36:22 IP:115.43.xxx.xxx 訂閱
假設 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-06-20 11:08:05 IP:59.120.xxx.xxx 訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-06-20 11:53:26 IP:115.43.xxx.xxx 訂閱
有的
只是我打錯字了 XD
改成
Adoquery1->FieldByName("產品編號")->AsString
就可以了
您也可以多多利用 軟體 的 Help 功能來查看元件的屬性
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
typer486
一般會員


發表:9
回覆:16
積分:5
註冊:2008-11-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-06-22 09:09:36 IP:59.120.xxx.xxx 訂閱
[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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-06-22 10:24:22 IP:122.118.xxx.xxx 未訂閱
去建一個全部都有的 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-06-22 15:09:16 IP:219.70.xxx.xxx 訂閱
  1. ADOQuery1->SQL->Add("where 產品編號 between ID_low and ID_up order by 產品編號");
  2. 此行發生錯誤,未加入參數標示
  3. ADOQuery1->Parameters->ParamByName("ID_low")->Value = lbledt_ID_low->Text.ToInt();
  4. ADOQuery1->Parameters->ParamByName("ID_up")->Value = lbledt_ID_up->Text.ToInt();
  5. ADOQuery1->Prepared = true;
  6. ADOQuery1->Open();
  7. int i;
  8. Memo1->Lines->Clear();
  9. i = 1;
  10. while (i<=lbledt_ID_up->Text)
  11. {
  12. if (ADOQuery1->FieldByName("產品編號")->Value == i)
  13. {
  14. ADOQuery1->Next();
  15. i ;
  16. }
  17. else
  18. {
  19. Memo1->Lines->Add(ADOQuery1->FieldByName("產品編號")->AsString);
  20. 改成 Memo1->Lines->Add(I);
  21. i ;
  22. }
  23. }
以上方法是需利用於 ID 不重覆下,
建議在挑出 缺號 前
先利用程式,檢查資料是否重覆

亦可將資料 group by 後
再進行條件範圍限制 (between)
及將資料排序
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-06-22 15:27:01, 註解 無‧
系統時間:2017-12-14 14:21:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!