請問SQL在四個資料表篩選並寫入的語法 |
尚未結案
|
marklue
一般會員 發表:33 回覆:55 積分:17 註冊:2005-02-09 發送簡訊給我 |
各位前輩好: 下列是我的資料表
ADOQuery1為客戶檔, Cus_c客戶編號
ADOQuery2為產品類別檔 Class_pc產品類別代碼
ADOQuery3為產品檔, Class_pc產品類別代碼 Num_p產品編號,(主KEY為此二欄位)
.......................... Una_p產品預設單價
ADOQuery4為單價檔, Cus_u客戶編號,Class_u產品類別代碼,
.......................... Num_u產品編號,Una_u產品單價(主KEY為前三欄位) 目的:條件 指定客戶與指定類別(已經用TDBLookupComboBox指定)
.........當單價檔中尚無產品紀錄時由產品檔讀取產品預設單價並寫入單價檔中
.........(比如單價檔中A01客戶且類別為1的資料有2筆,但是產品檔中類別1
..........有10筆資料,則產生另外8筆資料單價資料,並把預設單價Uun_p填入單價檔Una_u 請教各位前輩
這麼複雜的動作SQL的語法需要怎麼寫 謝謝!
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi marklue, 修正一下,大致是這樣寫
INSERT INTO 單價檔 (CUS_U, CLASS_U, NUM_U, UNA_U) SELECT T3.CUS_C, T1.CLASS_PC, T2.NUM_P, T2.UNA_P FROM 客戶檔 T3, 產品檔 T2, 產品類別檔 T1 WHERE T2.CLASS_PC = T1.CLASS_PC AND T1.CLASS_PC = :P_CLASS_PC AND T3.CUS_C = :P_CUS AND NOT EXISTS (SELECT * FROM 單價檔 P WHERE P.CUS_U T3.CUS_C AND P.CLASS_U = T1.CLASS_PC AND P.NUM_U = T2.NUM_P)發表人 -
------
Fishman |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
marklue
一般會員 發表:33 回覆:55 積分:17 註冊:2005-02-09 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
marklue 你好:
Fishman 版主其實已經點出精隨了,不愧是資料庫中的資料庫 我的sql語法如下:(在[新增]按下時)
ADOQuery5.close;
ADOQuery5.SQL.Clear;
ADOQuery5.SQL.add('Insert into 單價TABLE(Cus_u,Class_u,Num_u,Una_u)');
ADOQuery5.SQL.add('select ' Quotedstr(ADOQuery1.FieldByName('Cus_c').Asstring));
ADOQuery5.SQL.add(',' Quotedstr(ADOQuery2.FieldByName('Class_pc').Asstring));
ADOQuery5.SQL.add(',Num_p,Una_p from 產品TABLE');
ADOQuery5.SQL.add('where Num_p not in(select Num_u from 單價TABLE');
ADOQuery5.SQL.add('where Class_u=' Quotedstr(ADOQuery2.FieldByName('Class_pc').Asstring));
ADOQuery5.SQL.add('and Cus_u=' Quotedstr(ADOQuery1.FieldByName('Cus_c').Asstring));
若攔位是char型態要用Quotedstr來做雙引號
若攔位是int型態就把Quotedstr拿掉
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
marklue
一般會員 發表:33 回覆:55 積分:17 註冊:2005-02-09 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
marklue 你好:
請你測試一下
引言: ADOQuery5.close; ADOQuery5.SQL.Clear; ADOQuery5.SQL.add('Insert into 單價TABLE(Cus_u,Class_u,Num_u,Una_u)'); ADOQuery5.SQL.add('select ' Quotedstr(ADOQuery1.FieldByName('Cus_c').Asstring)); ADOQuery5.SQL.add(',' Quotedstr(ADOQuery2.FieldByName('Class_pc').Asstring)); ADOQuery5.SQL.add(',Num_p,Una_p from 產品TABLE'); ADOQuery5.SQL.add('where Num_p not in(select Num_u from 單價TABLE'); ADOQuery5.SQL.add('where Class_u=' Quotedstr(ADOQuery2.FieldByName('Class_pc').Asstring)); ADOQuery5.SQL.add('and Cus_u=' Quotedstr(ADOQuery1.FieldByName('Cus_c').Asstring)); ADOQuery5.ExecSQL;將這一段code insert into 的部分 改成select 就是 ADOQuery5.SQL.add('Insert into 單價TABLE(Cus_u,Class_u,Num_u,Una_u)'); 拿掉 ADOQuery5.ExecSQL; 改成 ADOQuery5.Open; 或將結果ADOQuery5.sql.SaveToFile('c:\test.txt'); 然後開啟access用查詢來檢查
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
marklue
一般會員 發表:33 回覆:55 積分:17 註冊:2005-02-09 發送簡訊給我 |
引言: ADOQuery5.close; ADOQuery5.SQL.Clear; ADOQuery5.SQL.add('Insert into 單價TABLE(Cus_u,Class_u,Num_u,Una_u)'); ADOQuery5.SQL.add('select '+Quotedstr(ADOQuery1.FieldByName('Cus_c').Asstring)); ADOQuery5.SQL.add(','+Quotedstr(ADOQuery2.FieldByName('Class_pc').Asstring)); ADOQuery5.SQL.add(',Num_p,Una_p from 產品TABLE'); ADOQuery5.SQL.add('where Num_p not in(select Num_u from 單價TABLE'); ADOQuery5.SQL.add('where Class_u='+Quotedstr(ADOQuery2.FieldByName('Class_pc').Asstring)); ADOQuery5.SQL.add('and Cus_u='+Quotedstr(ADOQuery1.FieldByName('Cus_c').Asstring)); ADOQuery5.ExecSQL;KO您好: 按照您的方式可以,我沒注意到ADOQuery5.ExecSQL;這行 但是只限於此客戶都沒紀錄者可新增成功 如果之前就有紀錄者會出現下列訊息 謝謝! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |