一次去面試,遇到了這樣一道題:
如下虛擬業務環境,請根據要求編寫sql指令碼
表一:t_user
表二:t_role
表三:請用sql語句將表一,表二內的資料填寫入錶三,規則:表一與表二關聯欄位id,表三info欄位為表一表二使用分隔符(:和@)合併而來。
這題我當時花了10分鐘依然沒有想出來乙個好的方案來,最後不得不放棄。
其實這題最麻煩的地方是在如何將表二中同一人的許可權資訊合併為一行,如果沒有特殊辦法,應該是不好解決的,最後在網上搜尋了幾天,終於找到了乙個oracle的函式sys_connect_by_path,此函式可以把乙個父節點下的所有子節點的字串連線起來。有了這個函式,這道題就有了突破口了。
首先我們將表二中的角色(role)和許可權(permission)字元連線起來,這個直接用「||」就可以做到了。
然後用sys_connect_by_path 進行字元連線,參考sql
select id, ltrim(max(sys_connect_by_path(info, '@')), '@') info
from (select info,
id,row_number() over(partition by id order by info desc) rn
from (select id as id, role || ':' || permission as info
from t_role) a)
start with rn = 1
connect by rn - 1 = prior rn
and id = prior id
group by id
注意連線出來的字串前面會帶乙個連線字元,本例中是乙個@符,用ltrim或substr去掉就好了。
之後的sql就很簡單了,乙個left join 就解決了,sql就不提供了。
不知道這種需求在實際應用中有沒有價值,反正我是碰到過,權且當作擴寬知識面吧。
oracle字串連線 擷取
查詢sql語句,同時為第二列形成乙個超級鏈結 select id,concat concat concat filename randomfilename,filesize from t fileinfo oracle的concat函式一次只能連線2個字串 select id,account,pas...
字串連線
輸入n個字串s i 你要把他們按某個順序連線起來,使得字典序最小。1 n 100 每個字串長度 100 字串只包含小寫字母 input 第一行乙個整數n。接下來每行乙個字串s i output 一行乙個字串表示把輸入的n個字串按某個順序連線之後的結果input示例 6 itlooks like an...
字串連線
mysql select abc 123 abc 123 123 1 row in set,1 warning 0.00 sec mysql select 123 123 123 123 246 1 row in set 0.00 sec mysql select 123 123 123 123 2...