前幾天把系統從oracle往mysql上遷移,很多的語句是比較簡單的,就是一些函數的修改如to-date等
Oracle 遷移至MySQL部分語句的轉換
[日期:2014-02-27] 來源:Linux社區 作者:jimmy609 [字體:]
前幾天把系統從Oracle往mysql上遷移,很多的語句是比較簡單的,就是一些函數的修改如to-date等
但是也有幾個比較棘手的,這里記錄下
第一、row_number() over(partition by
首先要了解下oracle中這個函數的用法,看個例子
select t.*,row_number() over(partition by t.owner order by y.createDate desc) rn from test t
這個語句的意思就是,把test這個表的數據按照owner 分組并且給每個分組的里面的數據加上一個序列號,數據格式如下
id name owner createDate rn
1 aa 001 1
2 bb 001 2
3 cc 001 3
4 dd 002 1
5 ee 002 2
6 ff 003 1
數據搞得不太正規,但是應該能夠看懂它的意思吧,
但是在mysql中是沒有這個函數的于是乎,找啊找,,總算找了個解決方法,如下
SELECT
heyf_tmp.*,
IF(@pdept=heyf_tmp.owner ,@rn:=@rn+1,@rn:=1) AS rn,
@pdept:=heyf_tmp.owner
FROM
(
SELECT
yv.*
FROM
test yv
ORDER BY
yv.owner ,
yv.createDate DESC
)
heyf_tmp ,
(
SELECT
@rn :=0 ,
@pdept := NULL ,
@rn:=0
)
aa
具體是什么意思,不是很清楚,不過先解決問題再說
第二、oracle樹形查詢
oracle樹形查詢現成的方法
select distinct t.id as id, t.name
from test t
start with id=‘’
connect by prior id = parentid
但是mysql中是沒有這個方法的,于是只能自己定義函數或者過程,我這里用的是過程
如下
CREATE PROCEDURE Pro_GetTreeList`(in pid varchar(36))
begin
declare lev int;
set lev=1;
drop table if exists tmp1;
CREATE TABLE tmp1(id VARCHAR(40),name varchar(50),parentid varchar(40) ,levv INT);
INSERT tmp1 SELECT id,name,parent_id,1 FROM `test` WHERE parent_id=pid;
while row_count()>0
do set lev=lev+1;
INSERT tmp1 SELECT t.id,t.name,t.parent_id,lev from testt join tmp1 a on t.parent_id=a.id AND levv=lev-1;--查出子節點
end while ;
INSERT tmp1 SELECT id,name,parent_id,0 FROM test WHERE id=pid; --查出當前節點
end
這個存儲過程應該都能看懂吧,就不做多解釋了
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com