一個使用SQL語句解決的小問題
我們在實際中,會遇到各種各樣的SQL編寫需求。由於SQL語句的特點,一些看似在過程化語句中很困難的問題,藉助一點點SQL技巧和經驗,就可以獲得意想不到的處理。
一個朋友在解決一個複雜問題時,將一個步驟問題諮詢筆者。雖然在大牛們眼中不費吹灰之力,但是筆者覺得還是有必要寫出來,作為將來遇到同類問題朋友們的一點點啟發。
1、問題說明
原始問題比較複雜,這裡只是提供一個簡裝本。注意:問題要求在10g上進行實現,這也就限制了一些Oracle特性,特別是分析函式的使用。
原始資料如下:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
SQL> select * from t;
ID1 ID2
---------- ----------
1 1
2 2
3 2
4 2
5 1
6 2
7 2
8 2
8 rows selected
資料表列id1和id2,id1為sequence生成的主鍵列,顯示結果按照id1進行排序。Id1取值單向增加,但是不一定連續。Id2為分組資訊列,當按照id1進行排列的時候,取值為1的表示一組開始。順序下取值為2的資料行歸屬在相同組,直到新一個取值1開始。
現在要求形成資料列,標記列名稱,分別按照a,b,c…順序下去。注意,每組數量不定。要求利用一句SQL解決,形成預期結果如下:
ID1 ID2
---------- ----------
1 1 a
2 2 a
3 2 a
4 2 a
5 1 b
6 2 b
7 2 b
8 2 b
2、問題分析
直觀的感覺和我們常見的複雜SQL有點差別。之後的分組需求很類似於oracle的分組函式或者層次查詢,但是又沒有明顯的特徵和層級關係。而且組的關係是建立在id1序列和id2共同確定的。所以,直接使用分組函式和層級函式的想法可能有點問題。
第二個難點是關於分組的名稱,abcd序列相差的關係,也就是組的差值1怎麼體現?
首先,筆者希望將組的概念體現出來,也就是將id=1體現出來。筆者試著寫一下。
SQL> select id1, id2, decode(id2,1,1,0) from t;
ID1 ID2 DECODE(ID2,1,1,0)
---------- ---------- -----------------
1 1 1
2 2 0
3 2 0
4 2 0
5 1 1
6 2 0
7 2 0
8 2 0
8 rows selected
在第三列,每個組開頭的資料行,都被設定為1,其餘是0。之後,我們需要將不同的組分割開,此時,可以藉助分析函式的累計和方法。對第三列進行累計處理,處理之後,可以方便的分出組來。
SQL> select id1, id2, sum(decode(id2,1,1,0)) over (order by id1) from t;
ID1 ID2 SUM(DECODE(ID2,1,1,0))OVER(ORD
---------- ---------- ------------------------------
1 1 1
2 2 1
3 2 1
4 2 1
5 1 2
6 2 2
7 2 2
8 2 2
8 rows selected
Sum over是我們最常使用的分析函式。依次累計,就可以區分出資料組來。
最後一步就是將這些差值變為字串a,b,c,可以使用chr函式。
SQL> select id1, id2, chr((sum(decode(id2,1,1,0)) over (order by id1))+96) res from t;
ID1 ID2 RES
---------- ---------- ---
1 1 a
2 2 a
3 2 a
4 2 a
5 1 b
6 2 b
7 2 b
8 2 b
8 rows selected
當資料變化的時候,也是這樣。
SQL> select id1, id2, chr((sum(decode(id2,1,1,0)) over (order by id1))+96) res from t;
ID1 ID2 RES
---------- ---------- ---
1 1 a
2 2 a
3 2 a
4 2 a
5 1 b
6 2 b
7 2 b
8 2 b
10 2 b
11 1 c
12 2 c
11 rows selected
3、結論
Oracle SQL配合提供的函式集合是非常強大的工具集合。我們只要充分利用這個利器,很多看似複雜和不可能實現的需求就可以方便的實現。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-733885/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 50個SQL語句(MySQL版) 問題十四MySql
- (xml中sql語句為紅)解決No data sources are configured to run this SQL and provide advanced的問題XMLSQLIDE
- pl/sql developer的一個小問題SQLDeveloper
- [20211221]分析sql語句遇到的問題.txtSQL
- Sql語句小整理SQL
- 20180417PLSQL中sql語句格式化與註解問題SQL
- 兩個看似奇怪的MySQL語句問題MySql
- 記一個實用的sql查詢語句SQL
- [20211229]toad下優化sql語句注意的問題.txt優化SQL
- [20230329]記錄除錯sql語句遇到的問題.txt除錯SQL
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- Oracle SQL精妙SQL語句講解OracleSQL
- 單個SQL語句的10046 traceSQL
- sql語句小技巧-持續更新SQL
- sql多參問題解決SQL
- [20240607]PL/SQL中sql語句的註解.txtSQL
- SQL 常用語句一覽SQL
- SQL Server 資料庫部分常用語句小結(一)SQLServer資料庫
- SQL 語句寫的爛怎麼辦?我幫你解決?SQL
- [20211229]sql語句包含中文儲存clob的編碼問題.txtSQL
- 一個小問題
- Java中如何解析SQL語句、格式化SQL語句、生成SQL語句?JavaSQL
- SQL語句SQL
- SQL語句IN的用法SQL
- MySQL入門---(一)SQL的DDL語句MySql
- [Laravel系列] 解決laravel中paginate()與distinct() count語句錯誤問題Laravel
- 解決AI的小資料問題AI
- 一個 MySQL sql 語句執行順序帶來的 bugMySql
- jsqlparser使用記錄---生成sql語句JSSQL
- Fastapi sqlalchemy DBApi 直接使用sql語句ASTAPISQL
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- [20211009]使用bash計算sql語句的sql_id.txtSQL
- 給隔壁的妹子講『一個SQL語句是如何執行的?』SQL
- 什麼是 Flink SQL 解決不了的問題?SQL
- 使用SQL語句將資料庫中的兩個表合併成一張表SQL資料庫
- 【SQL】Oracle SQL join on語句and和where使用區別SQLOracle
- OkHttp框架的一個Http500問題解決HTTP框架
- 解決github中一個新手著名問題Github
- 【SQL】9 SQL INSERT INTO 語句SQL