線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:947
推到 Plurk!
推到 Facebook!

請教下面的sql語法應有2筆卻出現三筆?

尚未結案
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-09 02:03:26 IP:202.145.xxx.xxx 未訂閱
以下sql語法小弟認為有邏輯上的錯誤結果,紅色部份只有兩筆但執行後 綠色部份出現三筆 而且當紅色部份是25筆時綠色部份則出現353筆 不知應如何下語法才正確 若是由直接下藍色部份則是25筆,但經由以下trigger則有353筆 是否藍色部份一直在被以某種方式trigger,如當insert into ins_tf_ml  一筆時就會trigger 藍色部份好幾筆 CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after   insert,delete,update as begin declare @ins_count int,         @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted  select @del_count=count(*) from deleted if @ins_count>0  begin insert into ins_tf_ml select *  from inserted    insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no),convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20),ins_tf_ml.prd_no), convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))),'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no end end 堅持從洗馬桶做起 Eric 發表人 - huangeider 於 2004/05/09 07:59:13 發表人 - huangeider 於 2004/05/09 08:00:26 發表人 - huangeider 於 2004/05/09 08:06:23
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-10 00:35:25 IP:203.204.xxx.xxx 未訂閱
huangeider 你好 你可以說明一下ins_tf_ml和mf_ml 兩個Tabel的關聯關係嗎?是一對一、一對多或多對一的關係?及其關聯Key為何? 如果這兩個Table以ml_no為關聯Key的結果不是一對一的關係時,就會發生你描述的現象。
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-10 02:40:59 IP:202.145.xxx.xxx 未訂閱
是一對多的情形,若把紅色部份改成如下情形是可以執行但是卻只有一筆 是否有辦法得到所有的結果集呢?如ins_tf_ml.itm=1..25的話 可否一次就正確選出來? CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted  select @del_count=count(*) from deleted if @ins_count>0 begin insert into ins_tf_ml select * from inserted    insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no),convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20),ins_tf_ml.prd_no), convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))),'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no and ins_tf_ml.itm=1 堅持從洗馬桶做起 Eric
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-10 03:35:41 IP:203.204.xxx.xxx 未訂閱
huangeider 你好     如果能提供ins_tf_ml mf_ml 這兩個Table的結構說明(關鍵欄位)及列出實際資料的代表內容,相信這樣更容易找到答案。因為不確定實際的資料結構及其關聯性,所以不敢亂下斷語。
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-10 18:56:09 IP:202.145.xxx.xxx 未訂閱
mf_ml是ins_tf_ml的表頭,ins_tf_ml是mf_ml的表身,關聯性欄位是ml_no itm是ins_tf_ml的項次別順序是由1開始每加一筆和ml_no相同編號的資料 itm就會加1,如ins_tf_ml的ml_no欄位編號有二筆是A00001時,第一筆itm是一 ,第二筆itm是二 ml_dd(ins_tf_ml)(datetime)是日期,ml_id(mf_ml)(varchar)是特定值如領料以4表示,prd_no(ins_tf_ml)(varchar)是品名代號,qty(ins_tf_ml)(varchar)是數量(mf_ml)(varchar),dep(varchar)是部門名,bat_no(ins_tf_ml)(varchar)是批次號 insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no),convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20),ins_tf_ml.prd_no), convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))),'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no 堅持從洗馬桶做起 Eric
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-10 20:32:27 IP:211.20.xxx.xxx 未訂閱
huangeider 你好     回頭看了第一篇貼文,發現好像是以下紅色部份的問題:< >< > < class="code"> CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @ins_count>0 begin Delete From ins_tf_ml<----- 是否應清除原有內容? insert into ins_tf_ml select * from inserted insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no) ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20) ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))) ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no end end
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-10 20:50:31 IP:202.145.xxx.xxx 未訂閱
引言: huangeider 你好 回頭看了第一篇貼文,發現好像是以下紅色部份的問題:< >< > < class="code"> CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml] after insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @ins_count>0 begin Delete From ins_tf_ml<----- 是否應清除原有內容? 嗯,應先清除,但是在測試時我也都會用空的table去試,但結果還是 如下面一對多的情形,這些天來的研究這個一對多的情形小弟已可用sql variant 代入解決,但是很麻煩的是要判斷給予sql variant的時機,也試過把需要的資料先另存在另一個table,但是若是架構大的話就很麻煩,也是大工程,不知這一對多的過濾後insert into的方法有更簡便的sql語法能達成嗎?還是只能慢慢的一步一步拆解? insert into ins_tf_ml select * from inserted insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no) ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20) ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))) ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no end end
堅持從洗馬桶做起 Eric
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-10 21:02:57 IP:211.20.xxx.xxx 未訂閱
ins_tf_ml 明細表 A0001 1 A0001 2 A0001 3 ..... A0001 25 mf_ml 主表 A0001 insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no) ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20) ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8))) ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no) from ins_tf_ml inner join mf_ml on ins_tf_ml.ml_no=mf_ml.ml_no 是會寫入25筆呀 除非 mf_ml 主表 A0001 .......... A0001 .......... 有兩筆以上的重複資料
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-10 22:08:46 IP:211.20.xxx.xxx 未訂閱
引言: 只有兩筆但執行後,綠色部份出現三筆(1 2=3) 若是由直接下藍色部份則是25筆,但經由以下trigger則有353筆 是否藍色部份一直在被以某種方式trigger,如當insert into ins_tf_ml 一筆時就會trigger 藍色部份好幾筆
huangeider 你好 答案好像是你自己懷疑的狀況喔!每Insert一筆觸發一次,且是以遞迴的方式觸發,所以筆數是從1 2=3, 1 2 3 4.... 25=325滿接近353的,檢查看看程序內,還有什麼狀況會觸發相同的程序,或是繞了一圈又觸發這個程序呢? 發表人 - chance36 於 2004/05/10 22:10:08
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-10 22:31:39 IP:202.145.xxx.xxx 未訂閱
小弟似乎明白了這個trigger道理 小弟這個trigger是由一應用程式異動而引發的 而這應用程式的異動方式和trigger的異動方式不同 經小弟測試這應用程就算是在update狀態下也都是以insert和delete 的方式去異動的,所以trigger的update就算在應用程式中看似update 的異動也無法作用,而疑問的是若應用程式中一起insert25筆, 在trigger中是一筆一筆新增即inserted的count是一然後增完一筆後再增一筆 而inserted永遠是一,也就是說要trigger25次,或者insert時是25筆而trigger中的inserted count也是25,而trigger一次就完成,不過測試的結果似乎是25,但是若是如此,以上的程式應不會被一直遞迴trigger?這個問題是小弟不清楚的,25個 insert trigger還是一次trigger 25次呢?對了當上面itm是25時應是325才對, 不好意思 堅持從洗馬桶做起 Eric 發表人 - huangeider 於 2004/05/10 22:35:43
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-10 22:54:15 IP:211.20.xxx.xxx 未訂閱
huangeider 你好 是否可以把mc_ti及ins_tf_ml 全部清除掉,單純測一次Insert 25筆記錄,看到底寫入幾筆,是不是325筆,你說結果有353筆,我想是不是前次殘存的記錄一起算到了。
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-10 23:07:37 IP:202.145.xxx.xxx 未訂閱
若是在analyzer query中執行是25筆 在trigger中則是325筆(ps 353筆當時是個模糊值 當時認為這個值沒有什麼邏輯所以用印像值3**來表示) 大概執行過不下幾十次都是如此結果 堅持從洗馬桶做起 Eric 發表人 - huangeider 於 2004/05/10 23:10:21
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-10 23:14:11 IP:211.20.xxx.xxx 未訂閱
引言: 若是在analyzer query中執行是25筆 在trigger中則是325筆(ps 353筆當時是個模糊值 當時認為這個值沒有什麼邏輯所以用印像值3**來表示) 大概執行過不下幾十次都是如此結果
huangeider 你好
改成如下看看
 
CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml]
after insert,delete,update
as
begin
  declare @ins_count int,
  @del_count int
  if @@rowcount = 0 return
  select @ins_count=count(*) from inserted 
  select @del_count=count(*) from deleted
  if @ins_count>0 begin
    // insert into ins_tf_ml select * from inserted 這行不要         insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no)
        ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20)
        ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8)))
        ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no)
    from inserted inner join mf_ml on inserted.ml_no=mf_ml.ml_no
  end
end
發表人 - chance36 於 2004/05/10 23:15:18
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-05-10 23:47:48 IP:202.145.xxx.xxx 未訂閱
這麼做法是正確有25筆 但小弟會使此異動trigger 下個條件 insert into tran_file select seq_id ml_id ml_no itm ml_dd prd_no qty trk_qty dep from mc_ti 這個應有25筆但卻出現325筆? 堅持從洗馬桶做起 Eric
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-05-11 00:22:53 IP:203.204.xxx.xxx 未訂閱
引言: 但小弟會使此異動trigger 下個條件 insert into tran_file select seq_id ml_id ml_no itm ml_dd prd_no qty trk_qty dep from mc_ti 這個應有25筆但卻出現325筆?
huangeider 你好 前面insert into mc_ti select .... 只是為了要轉換型態,以方便這個Insert的動作嗎?也就說mc_ti只是個中繼表格?我想應該不至於吧!所以程式改成
CREATE trigger [trigger_tf_ml_ins_del_upd] on [tf_ml]
after insert,delete,update
as
begin
  declare @ins_count int,
  @del_count int
  if @@rowcount = 0 return
  select @ins_count=count(*) from inserted 
  select @del_count=count(*) from deleted
  if @ins_count>0 begin
    // insert into ins_tf_ml select * from inserted 這行不要         insert into mc_ti select '4A',convert(char(2),mf_ml.ml_id),convert(char(10),mf_ml.ml_no)
        ,convert(char(3),ins_tf_ml.itm),convert(char(8),ins_tf_ml.ml_dd),convert(char(20)
        ,ins_tf_ml.prd_no),convert(char(8),(substring(convert(varchar(50),ins_tf_ml.qty),1,8)))
        ,'0',convert(char(10),mf_ml.dep),convert(char(15),ins_tf_ml.bat_no)
    from inserted inner join mf_ml on inserted.ml_no=mf_ml.ml_no        insert into tran_file select ...(自行對映欄位)...
    from inserted       end
end
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-05-11 11:13:46 IP:202.145.xxx.xxx 未訂閱
感謝chance36兄 原來我繞了一大圈 這次真的可行了 堅持從洗馬桶做起 Eric
系統時間:2024-05-17 5:52:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!