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

請問SQL在四個資料表篩選並寫入的語法

尚未結案
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-17 16:16:57 IP:203.73.xxx.xxx 未訂閱
各位前輩好: 下列是我的資料表 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-17 17:35:04 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-17 18:02:02 IP:220.132.xxx.xxx 未訂閱
marklue 你好: 請問資料庫類別? 請問程式動作? 要一次搜尋後就新增嗎? 因為處理方式不只一種,但為求最佳的方式還是請你說明
------
======================
昏睡~
不昏睡~
不由昏睡~
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-17 22:57:15 IP:203.73.xxx.xxx 未訂閱
引言: 請問資料庫類別? 請問程式動作? 要一次搜尋後就新增嗎? 因為處理方式不只一種,但為求最佳的方式還是請你說明
KO您好: 我用ACCESS資料庫,XP單機作業, 動作是用兩個TDBLookupComboBox指定客戶與產品類別 然後按下 '新增' 按鈕就啟動SQL轉檔 這個作業是讓使用者可將使用者交易單價事先建檔再讓使用者修改 以免使用者要逐筆建檔 不知道這樣清楚否 謝謝!
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-18 11:11:42 IP:220.132.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-19 02:32:39 IP:203.73.xxx.xxx 未訂閱
KO您好: Fishman 版主與您的方式都有試過 但是不知道我哪裡弄錯了ㄧ直會出現下列訊息     謝謝! 還有,我想貼上程式碼,但是縮排都無效,全部會靠左,無法像Fishman 版主那樣 因為看起來很吃力,所以我就暫時沒貼上!
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-19 11:50:53 IP:220.132.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-19 17:03:43 IP:203.73.xxx.xxx 未訂閱
引言: 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;這行 但是只限於此客戶都沒紀錄者可新增成功 如果之前就有紀錄者會出現下列訊息 謝謝!
系統時間:2024-05-19 0:55:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!