唔好意思, 唔知 ching 可唔可以幫忙試多樣.

之前話呢句 xyz 無用 aggregate function 包住唔得, 我都明白 ...
Super169 發表於 2016-4-1 01:47


你個 row id 都唔係 group by 啦
唔洗試都知 唔 work

min, max 呢 D 係得
但係多過一條就會錯, 仲唔止
無啦啦要 min max, 唔熟 sql 的人, 睇到人眼花都唔知係 dirty tricks
一有 bug 的時候你就唔慌要重寫過成個 query
太唔直觀的時候有時慳左 performance 但蝕左 maintenance

TOP

你個 row id 都唔係 group by 啦
唔洗試都知 唔 work

min, max 呢 D 係得
但係多過一條就會錯, 仲唔止
...
snoopy11hk 發表於 2016-4-1 03:12


ching 你唔係咁趣緻呀.

如果你話 SELECT 既 rowid 唔係 group by. 知道做緊乜既, 都知對應點改番.
我無得試, 而你之前只係話 xyz 唔得, 所以只係改左 xyz.

我一早都講左, 加個 min 會令睇 code 既人亂, 我只係純粹想睇下佢食乜野 syntax.
你又拋書包咁將我講既野演譯一次, 你係想話比我聽, 你吸收到我講乜?  定係話你無睇人講乜?
唔好只係將學到既野死背, 真係咁係都唔駛執我口水尾講番比我聽掛.

我果度會唔會多過一條....你唔係睇唔出掛?  
對 unique field 搵 min 會有機會多過一條? ching 玩左 SQL 幾耐, 仲會有咁既想法?
至於話會唔會亂, 睇你熟唔熟 GROUP 入面既 function 係點做.  
有 D 人甚至可能會以為 min 係 global 既 min 都得, 呢樣我都控制唔到.
當然, 我無話咁寫係好, 只係想了解個 engine 多 D.
明白一個 engine 點做野, 先至唔會做錯野, 可以做到合適既 tuning.
唔識又唔去諗既人, 你是旦寫句複雜少少既 SQL, 佢都會睇唔掂架啦.

最起碼咁樣做, 係有根據去做出黎, 結果係可以預知, 反而唔會出錯 (當你明白背後原因就知, 唔信你可以用唔同既 data 去試).

總好過你既做法, 就算唔睇 performance, 個答案都只係搏好彩中左, 而唔係必然既.

不過, 又試下幫你兜番喇 (我初時以為你會識咁諗, 但你上面既回應, 好明顯真係搏好彩)
你果句中既原因有可能係 Oracle 排完 GROUP 入面既野, 出現重複, 就自動跟輸入次序.
呢樣唔奇, 有 D engine 會咁做, 因為點都要有個之序出比人.
(記住, 上面既野係我講既, 唔好陣間又當正有新發現, 講番比我知.)

不過, 就算 Oracle 既 engine 講明有咁既特性, 你果句都係唔好, 可以好易去 tune 好 D. (只係基於你比出黎既野, 同埋上面既假設去 tune, 唔係大執).

點解?  比你思考一下, 遲 D 至答.  
你就當多左個大前提, 係 GROUP 果陣重複就會自動用輸入次序去排. (反正你果句都要靠呢樣野至 work, 就當佢成立.)
多 D 去研究下 SQL 既細節, 可以改善你寫野既效率.  唔好只係中左個答案就算.

TOP

本帖最後由 Super169 於 2016-4-1 11:09 編輯

忽然又諗到樣野 (同上面講點改你果句無關, 兩者可以結合, 但唔好攪亂)

唔知 Oracle 會唔會 support "SELECT FIRST" 或者 "SELECT TOP" 之類既 syntax?

如果得既, 你直接 SELECT FIRST 1 a.* OVER PARTITION ... 受唔受?
呢下真係唔知既, 純粹想學下野. 因為 SELECT FIRST 既 FIRST 未必可以對應 PARTITION 去做, 結果就有可能會針對成個 result set, 變成得番一條, 唔 work.  要睇 SELECT FIRST 再 OVER 會點演譯.

如果得既, 就唔駛拆開 sub-query, 亦都唔駛完全排序.

一般 support 得 SELECT FIRST, optimizer 都可以掃一次就出.  因為只要 keep 住最前既, SELECT FIRST 1 就等同於搵 min, 一直掃, 有需要就換, 只需要 one pass 就得, 唔需要完全排哂.  呢個亦係 SELECT FIRST 既好處, 唔需要做一個 full 既 result set 出黎.

TOP

本帖最後由 snoopy11hk 於 2016-4-1 13:15 編輯
忽然又諗到樣野 (同上面講點改你果句無關, 兩者可以結合, 但唔好攪亂)

唔知 Oracle 會唔會 support "SELEC ...
Super169 發表於 2016-4-1 11:02



    oracle 有 stop key 的野, 但係基本上只用係not exists/ exists/ rownum<=/analytic function

TOP

ching 你唔係咁趣緻呀.

如果你話 SELECT 既 rowid 唔係 group by. 知道做緊乜既, 都知對應點改番.
我無 ...
Super169 發表於 2016-4-1 09:52



    會唔會多過一條, 我之前的post 都有講
有好細的機會, 一條都可以過到 compile 到, 行到 (係 stored procedure)
再大的機會就係出 ora error, 過唔到
呢隻 ora error 唔係 runtime error 黎, 係 pre process error 黎

deterministic 唔係咁去 determine
deterministic 係靠 sufficient condition 去 bound 住佢

TOP

會唔會多過一條, 我之前的post 都有講
有好細的機會, 一條都可以過到 compile 到, 行到 (係 stored  ...
snoopy11hk 發表於 2016-4-1 13:10



如果一個 unique field 既 min 都唔 sufficient, 我真係唔知你想講乜了.
你講到個 server 連 unique 既野都可以出兩條, 呢樣就真係你前面講, 唔係我地呢D programmer 要負責的了.  如果連呢D都講, 根本就唔可以信個 db engine, 咁仲有乜好做.  你都可以話佢 sort / group 一樣可以出錯.  其實大家寫既 SQL, 都係假設個 engine 會跟 spec 做, 否則, 無理由話人地寫既就可能出事, 你寫既就唔會出事.
而且,  unique field 既 min 只有一條 row, 起碼係跟 spec 去講無錯 , 個 engine 出錯係另一回事.  總好過連出乜都唔肯定.

另外, 你諗到我話你果句加多個大前提令你既 result 成立之後, 仲有乜問題嗎?
我都想睇下, 你知唔知自己做緊乜, 同埋 under 唔同既 condition, 你會點做.

TOP

唔知之前有無師兄提過, sql 中的 record 對等的, 無先後之分, 如要有先後便要加一個 timestamp 的 field.

TOP

本帖最後由 snoopy11hk 於 2016-4-1 18:57 編輯
如果一個 unique field 既 min 都唔 sufficient, 我真係唔知你想講乜了.
你講到個 server 連 unique 既 ...
Super169 發表於 2016-4-1 13:53



咁你好明顥係無睇到頭先你自己講咩
講緊的係 唔落 aggregate function 的 unique field 照行 group by other field 會唔會有事, 講左就話會出事, 行唔到, 會出 ora error
你連 run 都 唔到仲同我講用 unique field 揾 min

用 unique field 揾min 呢隻 pattern 當然有
好多其實 multitable referencing 的 field 都會咁做
為的係 row collapse

呢個 concept 講左好多次aggregate 係用黎做 row collapse
唔要 row collapse 唔好用 aggregate

TOP

唔知之前有無師兄提過, sql 中的 record 對等的, 無先後之分, 如要有先後便要加一個 timestamp 的 field. ...
chancho 發表於 2016-4-1 16:49


其實連 timestamp 都唔 guarantee 係 unique
係要 Foreign Key + timestamp as a Primary Key 先 unique 到

TOP

咁你好明顥係無睇到頭先你自己講咩
講緊的係 唔落 aggregate function 的 unique field 照行 group by  ...
snoopy11hk 發表於 2016-4-1 18:55



我唔熟 oracle 既 syntax, 但重點係明白做緊乜, 再跟番 syntax 去執.   
唉....連個原理都解釋埋, 你都仲唔識轉既, 我都投降了.  

之前講過你句野有問題, 都應該解釋埋比你聽, 唔好當左我亂吹:

你果句野, 係基於 SQL engine SELECT 一 group 無排序既 data 會用番事入次序至會 work.
(我無話呢句野一定成立, 只係你果 SQL 要基於呢樣野至合理)

- 如果以上唔成立, 你果句野既結果係不能確定, 所以係好大問題既 SQL.  
- 如果以上成立, 你果句野的確可以做出想要既答案.  如果只係要答案, 勉強可以叫 OK.
   不過, 如果以上成立, 你果同樣係有點多餘, 因為既然同一 group 入面, 無排序會跟事入次序, 跟本就唔需要用 input_date 排一次.

所以, 我話你果句好唔掂, 一係就好彩中答案, 一係就自已打自己, 畫蛇添足.

睇你都係做到答案就算既人, 如果唔明白我講乜, 就當我無講過喇.  多多得罪了.

TOP