iT邦幫忙

DAY 2
1

哇咧~夠了(Oracle SQL)系列 第 2

單一SQL好,還是PL/SQL好?最好是再多問一句:哪一種寫法比較Smart!

從前在Yahoo家族開過一個"雅輔之家",網友(族友)總愛問: 哪種寫法比較Smart?
我總愛說: 資料庫開發的世界,只有輸出報表結果是對或不對?沒有Smart的說法!
真的要做比較的話,應該是比誰的報表跑比較快,可以得出正確輸出結果。
當然,我是指同一部主機、同樣條件。
為何我這麼說?
以前剛學Basic,學寫 1+2+3+4+...+100 = ?
我是這麼寫的(語法如果有錯,就將就點跳過,畢竟太久沒寫了)

解法1:
total = 0
For i = 1 to 100
total = total + i
next i
print "Total = "; total

寫法沒錯吧!這是標準答案的寫法。

但,下面這句大家都看得懂吧!
解法2:
print "Total = "; (1 + 100 ) * 100 / 2

請問各位,你認為哪個Smart?相信絕大部分的人都會說解法2。
但你有看過這種寫法嗎?
解法3:
print "Total = "; 1+2+3+4+...+99+100 (中間+5~+98省略不打)
解法4:
print "Total = 5050"
解法3,4,看到想笑吧!但是,答案是一模一樣!Total = 5050

但解法3,4不討論,真正寫過資料庫應用程式開發的人,通常會補充一句: 不喜歡解法2。
是因為他們會說這句嗎?最好是有那種,簡單套公式、用函數就可以寫的程式啦!
其實不是,因為解法2,只有知道這個(梯形)公式的人才知道意思!
如果寫的人,不加註解說:我是用某某公式,那麼後面維護的人,絕對會抱怨死那個寫這行程式的人!

維護前人寫的程式,絕對是身為MIS最感到痛苦的前十項排名之一。

說了一大堆,還用不是SQL的案例,好吧!回歸重點,單一SQL好,還是PL/SQL好?
跟上面舉例一樣,答案是對的就好,解法2跑的飛快不是嗎?解法1要跑100個迴圈呢。
資料庫應用軟體開發過程,Performance永遠是最難從MIS身上得到答案的!為何?
因為SQL Tuning的工作是DBA負責的!

回到前一篇案例我說的 Select * From Dual;引發我另一個靈感...

不管是學哪一種程式,我們都練習過99乘法表,請問各位在不開暫存table的前提下,如何做到?
我說的暫存table,是指至少開了一個table紀錄1,2,3,...9,共9筆紀錄這種?

我的寫法,
其實只是利用一個>=9筆的系統table來產生一個子查詢,外加不合理連結子查詢的結果
這涉及一個不正確觀念(我也不建議這種寫法),但巧妙利用卻可產生正確結果。
Select a.a1 || ' * ' || b.b1 || ' = ' || a.a1 * b.b1 "9*9"
From (Select Rownum A1 From All_Tables Where Rownum <= 9) A
, (Select Rownum B1 From All_Tables Where Rownum <= 9) B

9*9

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
.....省略....
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45

9*9

9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

已選取 81 個資料列.

如我之前所說,如果我不加註解、說明,很多人看不懂我在寫甚麼?
更違反兩個子查詢為何沒有連結的觀念,但結果是對的!好像有點歪理喔。


上一篇
Oracle SQL 從 Select * From Dual; 開始囉~
下一篇
(續)單一SQL好,還是PL/SQL好?
系列文
哇咧~夠了(Oracle SQL)28

1 則留言

0
鐵殼心
iT邦高手 1 級 ‧ 2013-09-17 17:51:15

沙發
灑花

月半車甫 iT邦研究生 3 級 ‧ 2013-09-18 14:11:08 檢舉

感謝支持。

我要留言

立即登入留言