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

請教一個SQL語法的問題!!

尚未結案
jch
中階會員


發表:111
回覆:224
積分:66
註冊:2003-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-12 12:56:44 IP:163.17.xxx.xxx 未訂閱
where (c.i_date>a.validiay or (a.validiay<=:today)) 小弟的條件是希望只有一邊成立,就是當地一個條件成立時就忽略第二個條件, 因為有可能兩邊都成立,那結果會多出一筆資料來!! 以上的語法不知該如何改寫呢?? ======================== 我是DELPHI5的初學者
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-12 13:32:57 IP:210.65.xxx.xxx 未訂閱
Hi jch,    看來語法上沒什麼大問題,為何結果會多出一筆資料來? 可否再提供更詳細之說明與需要。 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
timhuang
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-12 14:01:53 IP:203.95.xxx.xxx 未訂閱
hi, 請試試: where (c.i_date>a.validiay and not a.validiay<=:today) or (not c.i_date>a.validiay and a.validiay<=:today) PS. 你要的功能是不是[互斥或](xor)?? ================================== A ⊕ B = (~A) & B A & (~B) ⊕: xor ~: not & : and : or ==================================
jch
中階會員


發表:111
回覆:224
積分:66
註冊:2003-12-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-12 14:15:32 IP:163.17.xxx.xxx 未訂閱
多謝兩位大哥!!以下是小弟的完整的SQL with q11 do begin DatabaseName := mCmp.Data; RequestLive := False; with SQL do begin Clear; Add('select a.num, a.num_date, a.cus_code, e.cus_abbr, b.item_no, f.item_desc1, b.quan, b.unit,'); Add('d.quan, a.validiay, c.i_date from sal_pric_m a'); Add('left join sal_pric_item b on a.num=b.num'); Add('left join sal_ship_item d on a.num=d.in_num and b.datetime=d.datetime'); Add('left join sal_ship_m c on c.num=d.num'); Add('left join sal_cus e on a.cus_code=e.cus_code'); Add('left join sal_item f on b.item_no=f.item_no'); Add('where (a.grp=2)'); Add('and a.status in (:status1,:status2)'); Add('and ((c.i_date>a.validiay and b.sell_qty<>0 and c.status<>:status3 and c.status<>:status4) or (a.validiay<=:today and b.sell_qty=0))'); if (B_CUS.Text <>'') and (E_CUS.Text='') then begin Add('and a.cus_code=:cus_code'); ParamByName('cus_code').AsString := mt11.FieldByName('cus_code').AsString; end; if (B_CUS.Text <>'') and (E_CUS.Text<>'') then begin Add('and a.cus_code between :b_cus and :e_cus'); ParamByName('b_cus').AsString := mt11.FieldByName('cus_code').AsString; ParamByName('e_cus').AsString := mt12.FieldByName('cus_code').AsString; end; Add('and a.num_date between :b_date and :e_date'); Add('order by a.num'); end; ParamByName('status1').AsString := '核准'; ParamByName('status2').AsString := '出貨'; ParamByName('status3').AsString := '登錄'; ParamByName('status4').AsString := '取消'; ParamByName('b_date').AsDateTime := B_DATE.CalendarDate; ParamByName('e_date').AsDateTime := E_DATE.CalendarDate; ParamByName('today').AsDateTime := Date; Prepare; Open; 其中sal_pric_m 為訂單的表頭資料 sal_pric_item 為訂單的表身資料 sal_ship_m 為銷貨單的表頭資料 sal_ship_item為銷貨單的表身資料 sal_item sal_cus只是參考他的客戶簡稱和產品名稱 以上是為了做訂單延遲交貨的明細表 其中c.i_date>a.validiay 表示出貨日期>預定交貨日期 又可能只有訂單沒有出貨單所以又加上a.validiay<=:today來判別預定交貨日期是否已經超過!! 但是a.validiay<=:today成立時c.i_date>a.validiay 也會成立所以查詢出來的資料卻多出一筆!!不知該如何修改程式???幫幫吧!! ======================== 我是DELPHI5的初學者
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-13 15:07:13 IP:210.65.xxx.xxx 未訂閱
Hi jch,    ((已出完貨) and (出貨日>預定出貨日)) or ((未出完貨) and (預定出貨日<:Today)) 或是 ((有出貨單) and (出貨日>預定出貨日)) or ((無出貨單) and (預定出貨日<:Today)) ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
jch
中階會員


發表:111
回覆:224
積分:66
註冊:2003-12-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-13 16:58:54 IP:163.17.xxx.xxx 未訂閱
多謝各位大哥的指教,小弟問題已經解決了!! 我將 d.quan 這個欄位改用子查詢來達到資料,問題就解決了!!多謝各位大哥的幫忙!! ======================== 我是DELPHI5的初學者
系統時間:2024-05-17 1:56:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!