如何查出資料庫裡面重覆的資料? |
尚未結案
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
SQL : Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name) > 1 or (select count(*) from pm3d T3 where T1.ID = T3.ID) > 1 or (select count(*) from pm3d T4 where T1.Tel = T4.Tel) > 1 order by ID, Name, Tel 若資料多這樣會比較慢而且 Tel 的重覆可能不連續(因為以 ID 及 Name 先排序) 所以你亦可以一次只處理少些欄位刪掉 where 中不用的便可如 Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.ID = T2.ID) > 1 order by ID 又或你認為 ID 及 Name 同時相同才算重覆的話,則可改成 Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.ID = T2.ID and T1.Name = T2.Name) > 1 order by ID,Name |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 來插個花. 個人覺得應該用 aggregate function (集總函數) 來使用會比較快, 尤其是在資料量大的時候, 所以建議你使用 ha0009 兄的用法是比較理想的, 使用 count 這個 aggregate function 配合 group by 子句和 having 條件式可以達到你要找的資料, 例如找出重覆的姓名: select A2, COUNT(A2) from pm3d.table1 group by A2 having COUNT(A2) > 1 即可找出所有重覆姓名欄位的資料. 但若是要找出單筆單筆資料的全部內容的話, 就得利用 Mickey兄和 Justmade 兄的方法, 也就是利用 subquery (子查詢) 的方式來進行!!
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
引言:有些看不太明白,T1,T2,T3,T4是做什麼的?是產生出來的變數嗎?SQL : Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name) > 1 or (select count(*) from pm3d T3 where T1.ID = T3.ID) > 1 or (select count(*) from pm3d T4 where T1.Tel = T4.Tel) > 1 order by ID, Name, Tel |
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
|
FrederickPau
資深會員 發表:4 回覆:161 積分:268 註冊:2002-11-04 發送簡訊給我 |
可以改成這樣試試, 如果你指的空白是 '', 就可以這樣
SQL : Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name <> '') > 1如果你指的空白是 NULL, 可以這樣 SQL : Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name is not NULL) > 1 |
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
引言: 可以改成這樣試試, 如果你指的空白是 '', 就可以這樣這個方式執行時會出現錯誤訊息: Project MDIAPP.exe raised exception class EOleException with message '[Microsoft][ODBC SQL Server Driver][SQL Server]無效的資料行名稱''。SQL : Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name <> '') > 1 引言: 如果你指的空白是 NULL, 可以這樣如果這個方式,仍然會有空白的資料被列出。SQL : Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name is not NULL) > 1 |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言:應是你打錯欄位名罷,所有欄位名包括 FrederickPau 兄新加的紅色部份也要換成真正的欄位名喔。引言: 可以改成這樣試試, 如果你指的空白是 '', 就可以這樣這個方式執行時會出現錯誤訊息: Project MDIAPP.exe raised exception class EOleException with message '[Microsoft][ODBC SQL Server Driver][SQL Server]無效的資料行名稱''。Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name <> '') > 1 |
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
己經改成這樣
ADOQuery1.SQL.Add('where (select count(*) from pm3d T2 where T1.A4 = T2.A4 and Trim(T1.A4) <> '') > 1');但執行時會出現錯誤訊息: [Microsoft][ODBC SQL Server Driver][SQL Server]'Trim'為無效識別的函數名稱。 (奇怪這個函數從Clipper都是很好用的函數,怎麼會不能用,難到名稱不一樣嗎?) PS. to chih 我放在網站的檔案,不要忘了去抓喔,抓完通知我好移除,謝謝您。 |
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
可以了,改成這樣就可以了,奇怪吔,第一次改時為什麼不行呢?
ADOQuery1.SQL.Add('where (select count(*) from pm3d T2 where T1.A7 = T2.A7 and T1.A7 IS NOT NULL) > 1');該給誰分呢?嗯... 給Justmade版主好了,因為他直接用我使用的欄位做說明,很容易明白。 也感謝:「Mickey版主、ha0009、timhuang、FrederickPau及chih」謝謝您們的指導,使這個站備感温馨 備註:給 |
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
奇怪吔,換一個欄位又不行了,空白資料還是列出,列出程式碼如下:
procedure TForm1.SpeedButton15Click(Sender: TObject);
begin
ADOQuery1.Active := false;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Add('Select * from pm3d T1');
ADOQuery1.SQL.Add('where (select count(*) from pm3d T2 where T1.A13 = T2.A13 and T1.A13 IS NOT NULL) > 1');
ADOQuery1.SQL.Add('order by T1.A13');
if(not ADOQuery1.Prepared) then
begin
ADOQuery1.Prepared;
end;
ADOQuery1.OPEN;
ADOQuery1.close;
ADOQuery1.Open;
Label3.Caption:=IntToStr(ADOQuery1.RecordCount);
DataSource1.DataSet :=ADOQuery1;
DBGrid1.DataSource := DataSource1;
end;
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
jawtair
一般會員 發表:30 回覆:92 積分:24 註冊:2003-04-26 發送簡訊給我 |
引言: 改這樣試試: ADOQuery1.SQL.Add('where (select count(*) from pm3d T2 where T1.A13 = T2.A13 and isnull(rtrim(T1.A13),'#39#39')<>'#39#39') > 1');吔!Mickey版主,勵害喔!看來又是#39的問題,我本來有想到是不是這個問題,但想到把兩個#39放在一起可能會有問題,所以沒有去試,感謝:) 發表人 - jawtair 於 2003/06/19 11:24:25 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |