以SQL的方式思考

用整體的方式思考問題

本章中的第一個例子很有趣,在很多情況下,用數(shù)據(jù)集的方式思考問題會簡單的多,用整體的方式可以忽略很多不必要的內(nèi)部細(xì)節(jié)。
作者提到一個例子,一個任務(wù)要求找出訂購的每個商品數(shù)量都完全相同的訂單,該如何解決?
采用過程式的思維,我們需要兩次循環(huán),一次循環(huán)找出每個訂單,第二次循環(huán)需要在第一次循環(huán)中找到每個訂單所屬的每個商品的訂購數(shù)量,然后比較。而整體性的思考方式則把每一個訂單當(dāng)做一個整體,我們關(guān)注的是這個整體內(nèi)是否出現(xiàn)訂購商品數(shù)量不同的商品,如果有,則不符合篩選條件。
可以把這個問題的代碼寫的非常簡潔:

code1

啟發(fā)式方法的思考

作者在這一章節(jié)中說,在嘗試去解決一個問題的時候,首先應(yīng)該做的是用邏輯清晰的語言去描述這個問題.現(xiàn)在嘗試著用自然語言將本周的作業(yè)描述為下面的話:
 ?。⒛骋粋€給定的城市的所有所屬稅務(wù)機(jī)構(gòu)在給定日期的稅率"
這樣說可能會讓第一次看這句不能抓住重點,考慮嘗試書中提到的方法"在名詞前面添加'所有.....的集合'",我們可以把這句話變?yōu)椋?br>   "某一個給定城市的所有所屬稅務(wù)機(jī)構(gòu)在給定日期稅率的集合"
現(xiàn)在我們的目的就顯得非常明確了,我們要得到一個稅率的集合,這個集合的內(nèi)容是某個城市的所有稅務(wù)管理機(jī)構(gòu)在某個時間點的稅率.
在這樣一個表述的過程中,我們應(yīng)該不去用“計算”,“遍歷”這些動詞,這些詞具有非常明顯的過程式語言的色彩,對于過程式語言,我們關(guān)注的是解決方案,而對于SQL這樣申明式的集合操作語言,我們關(guān)注的應(yīng)該是我們到底需要什么。按照畫圓和畫數(shù)據(jù)集的方式,嘗試進(jìn)行思考:
行政區(qū)域劃分集合A1 + 各行政區(qū)域稅務(wù)信息集合A2 -----> 某一個城市所屬所有行政區(qū)域稅務(wù)集合A3 ----> 某一個城市所屬的所有行政區(qū)域在當(dāng)前日期的稅率集合A4
集合A4就是我們最終需要的結(jié)果


image.png

SQL同樣允許存根,這對于SQL語言本身也許并不是必要的,SQL是一門緊耦合的語言。但我認(rèn)為存根對于程序員而言是有意義的,一個復(fù)雜的問題可能需要很多步驟,存根可以保存我們上一步的思考。就像上面對本周作業(yè)的分析,求得A4,既可以在一條SQL里一氣呵成,也可以分別求出A3,A4。使用WITH 保存A3,然后根據(jù)A3求得A4,可以化簡這個問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容