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

如何查出資料庫裡面重覆的資料?

尚未結案
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-18 20:51:37 IP:61.221.xxx.xxx 未訂閱
由於資料庫已經有20多年的歷史了,造成裡面重覆的資料甚多,請問各位先見,要如何用ADOQuery1元件的查詢語法,用DBGrid1將重覆的資料列出來? 例如:資料庫pm3d A2 重複的姓名 A4 重複的身份證號 A6 重複的住它電話 .............等等 有沒有可能做的到,新手的問題,盼能指導,謝謝大家。
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-18 21:18:49 IP:218.32.xxx.xxx 未訂閱
select * from [TableName] a where (select count(*) from [TableName] b where b.A2=a.A2)>1
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-18 21:23:35 IP:218.16.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-18 21:30:24 IP:61.56.xxx.xxx 未訂閱
你好: SELECT 客戶.連絡人, Count(客戶.連絡人) AS 重複數目 FROM 客戶 GROUP BY 客戶.連絡人 HAVING (((Count(客戶.連絡人))>1));    上面的語法請你修改成符合你的狀況,希望能給你一些幫助
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-18 22:03:00 IP:61.62.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-18 22:40:03 IP:218.16.xxx.xxx 未訂閱
我最初寫的也是跟 hu009 差不多一樣的寫法,按 post 前一想,這樣找出來的只看見這個姓名這個 ID 的是重覆的,有三次。 要看一下其他資料比對一下嗎,看不到。 要刪掉另外兩項嗎,刪不到。 只能對著資料乾瞪眼 (說笑啦,是要用另一 > >
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-18 23:18:23 IP:61.221.xxx.xxx 未訂閱
哇!一下子就五篇吔,太棒了,趕快試看看嘍,謝謝大家。
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-18 23:26:04 IP:61.221.xxx.xxx 未訂閱
引言:
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    
有些看不太明白,T1,T2,T3,T4是做什麼的?是產生出來的變數嗎?
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-18 23:29:52 IP:61.56.xxx.xxx 未訂閱
你好: Select * from pm3d T1 等於 Select * from pm3d As T1 表示 T1 是 pm3d 的別名。這可是基本的 SQL 應用喔。你該多翻翻 SQL 的書籍喔
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-18 23:41:58 IP:218.16.xxx.xxx 未訂閱
補充一下為甚麼要用 4 個別名 : 因為四個 select 都是 pm3t 若不用別名 where 做對比時便不知道要那個和那個比了 所以給 4 個 select 的 pm3t 四個不同的別名以識別。
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-18 23:54:32 IP:61.221.xxx.xxx 未訂閱
引言: 你好: Select * from pm3d T1 等於 Select * from pm3d As T1 表示 T1 是 pm3d 的別名。這可是基本的 SQL 應用喔。你該多翻翻 SQL 的書籍喔< face="Verdana, Arial, Helvetica"> 我正在翻「施威銘研究室」出的「SQL Server 2000設計實務」還沒看到這一部份,希望能試的出來。謝謝大家!
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-19 00:36:57 IP:61.221.xxx.xxx 未訂閱
引言:
SQL :    Select * from pm3d T1
  where (select count(*) from pm3d T2 where T1.Name = T2.Name) > 1
如果要過濾掉欄位空白,例如:該筆空白(沒有輸入電話),讓只有資料的才作重複查詢?是否可行? 謝謝大家。
FrederickPau
資深會員


發表:4
回覆:161
積分:268
註冊:2002-11-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-06-19 04:16:52 IP:61.228.xxx.xxx 未訂閱
可以改成這樣試試, 如果你指的空白是 '', 就可以這樣
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-06-19 09:08:22 IP:61.221.xxx.xxx 未訂閱
引言: 可以改成這樣試試, 如果你指的空白是 '', 就可以這樣
SQL :    Select * from pm3d T1
  where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name <> '') > 1
這個方式執行時會出現錯誤訊息: Project MDIAPP.exe raised exception class EOleException with message '[Microsoft][ODBC SQL Server Driver][SQL Server]無效的資料行名稱''。
引言: 如果你指的空白是 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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-06-19 09:14:45 IP:218.16.xxx.xxx 未訂閱
引言:
引言: 可以改成這樣試試, 如果你指的空白是 '', 就可以這樣
Select * from pm3d T1
  where (select count(*) from pm3d T2 where T1.Name = T2.Name and T1.Name <> '') > 1
這個方式執行時會出現錯誤訊息: Project MDIAPP.exe raised exception class EOleException with message '[Microsoft][ODBC SQL Server Driver][SQL Server]無效的資料行名稱''。
應是你打錯欄位名罷,所有欄位名包括 FrederickPau 兄新加的紅色部份也要換成真正的欄位名喔。
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-06-19 09:17:27 IP:61.221.xxx.xxx 未訂閱
引言: 應是你打錯欄位名罷,所有欄位名包括 FrederickPau 兄新加的紅色部份也要換成真正的欄位名喔。
有!我有將name改成欄位名稱,如果不改則無法Compiler..
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-06-19 09:25:19 IP:211.74.xxx.xxx 未訂閱
改成這樣試看看. Select * from pm3d T1 where (select count(*) from pm3d T2 where T1.Name = T2.Name and Trim(T1.Name) <> '') > 1 TRY TRY SEE
引言: 有!我有將name改成欄位名稱,如果不改則無法Compiler..
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-06-19 09:44:42 IP:61.221.xxx.xxx 未訂閱
己經改成這樣
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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-06-19 10:22:34 IP:61.221.xxx.xxx 未訂閱
可以了,改成這樣就可以了,奇怪吔,第一次改時為什麼不行呢?
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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-06-19 10:25:27 IP:211.74.xxx.xxx 未訂閱
我試過我貼的語法在你的Access Table裡面是可行的我想應該是你的程式有問題,請你把該段程式碼貼出來讓大家幫你看看好了.. PS:資料晚上才能抓,抓完在告訴您..<>< face="Verdana, Arial, Helvetica">引言: 己經改成這樣
ADOQuery1.SQL.Add('where (select count(*) from pm3d T2 where T1.A4 = T2.A4 and Trim(T1.A4) <> '') > 1');
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#21 引用回覆 回覆 發表時間:2003-06-19 10:40:52 IP:61.221.xxx.xxx 未訂閱
奇怪吔,換一個欄位又不行了,空白資料還是列出,列出程式碼如下: 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

發送簡訊給我
#22 引用回覆 回覆 發表時間:2003-06-19 10:53:22 IP:218.163.xxx.xxx 未訂閱
改這樣試試: ADOQuery1.SQL.Add('where (select count(*) from pm3d T2 where T1.A13 = T2.A13 and isnull(rtrim(T1.A13),'#39#39')<>'#39#39') > 1');
jawtair
一般會員


發表:30
回覆:92
積分:24
註冊:2003-04-26

發送簡訊給我
#23 引用回覆 回覆 發表時間:2003-06-19 11:04:06 IP:61.221.xxx.xxx 未訂閱
引言: 改這樣試試: 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
系統時間:2024-11-25 10:35:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!