機(jī)房收費(fèi)系統(tǒng) 之 組合查詢BUG
來源:程序員人生 發(fā)布時(shí)間:2014-10-02 08:00:00 閱讀次數(shù):3278次
聲明:以下內(nèi)容只對(duì)在學(xué)生上機(jī)記錄查詢(組合查詢)只查詢已下機(jī)記錄,操作員工作記錄(組合查詢)只查詢已注銷記錄的同學(xué)適用!
說是BUG,其實(shí)這也不是一個(gè)BUG,只是一個(gè)不小心容易犯的錯(cuò)誤,而且不注意的話還真發(fā)現(xiàn)不了。下面就給大家詳細(xì)的講講:
在機(jī)房收費(fèi)系統(tǒng)中有三個(gè)組合查詢:學(xué)生基本信息查詢、學(xué)生上機(jī)記錄查詢、操作員工作記錄查詢;其中的學(xué)生上機(jī)記錄查詢,我個(gè)人認(rèn)為應(yīng)該只查詢出已經(jīng)下機(jī)的記錄,正在上機(jī)的記錄不應(yīng)該被查詢出來;操作員工作記錄也是同樣的。
如果你跟我也是一樣的想法,那就接著看看我們的實(shí)現(xiàn)方式是否一樣吧:組合查詢的SQL語句都是拼接字符串拼出來的,但是我們拼出來的正確嗎?
第一種方法:


第二種方法:


一樣的數(shù)據(jù),一樣的組合查詢卻出來了不同的查詢結(jié)果?怎么會(huì)這樣呢?肯定是我們自己的問題。我們都知道在組合查詢中的SQL查詢語句是一個(gè)個(gè)條件拼接出來的,但是我們拼接的到底正確不正確呢?
第一種拼接:
select * from T_Line where status !='正在上機(jī)' and cardNo >'0' or cardNo < '5'

第二種拼接:
select * from (select * from T_Line where status!='正在上機(jī)')as T_Line where cardNo > '0' or cardNo < '5'

對(duì)于第一種拼接,就是特別簡(jiǎn)單的在后面加一個(gè)條件進(jìn)行拼接,我相信一定有人跟我犯過同樣的錯(cuò)誤哦!其實(shí)只要我們把SQL語句寫出來,就能很容易的看見自己錯(cuò)在什么地方:如果所有的條件之間都是用“and”連接,也能查詢出正確的結(jié)果,但是,當(dāng)我們用“or”連接條件的時(shí)候呢?
對(duì)于第二種拼接,首先是用一個(gè)子查詢查詢出滿足“已下機(jī)”這個(gè)條件的結(jié)果作為一個(gè)臨時(shí)變,然后再從這個(gè)臨時(shí)表中查詢我們想要查詢的數(shù)據(jù),這樣,不管后面的條件是“and”還是“or”都不會(huì)查詢出正在上機(jī)的記錄。
經(jīng)過上面簡(jiǎn)單的講解,相信大家都明白自己的BUG出現(xiàn)在什么地方,如果還有不明白,或者更好的解決方案,歡迎私下討論......
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)