本文用途:因為暫時沒有時間去具體看oracle sql的官方文檔 ,紀(jì)錄oracle的一些特殊寫法。 (不斷更新)
1. with ... as ...
with querya as (select * from TB_Test)
2 case .. (when .. then) .... (when .. then) .. else ... end
SELECT FO_FULFILL_TRX_STRING.SEQUENCE_NO, AC_TYPE_ORDER.CODE, CASE
WHEN AC_TYPE_ORDER.CODE = 'SO'
THEN ( SELECT ORDER_NUMBER FROM SO_ORDER WHERE SO_ORDER.AID = FO_FULFILL_TRX_STRING.AID_ORDER_SO )
ELSE ( SELECT ORDER_NUMBER FROM PO_ORDER WHERE PO_ORDER.AID = FO_FULFILL_TRX_STRING.AID_ORDER_PO )
END ORDER_NUMBER
FROM FO_FULFILL_TRX_STRING, AC_TYPE_ORDER.CODE
------------------------------------------------------------------------------------------------------------------------------
MYSQL 正則支持
select * from tb_rule_list where expression regexp '^.*\\$\\{0}\\[3].*$';
Oracle 正則函數(shù)支持
ORACLE中的支持正則表達式的函數(shù)主要有
REGEXP_LIKE :與LIKE的功能相似
REGEXP_INSTR :與INSTR的功能相似
REGEXP_SUBSTR :與SUBSTR的功能相似
REGEXP_REPLACE :與REPLACE的功能相
------------------------------------------------------------------------------------------------------------------------------
在MYSQL 中 select 可以顯示 不是group by 中的分組字段, 可以是任意的數(shù)據(jù)列,具體數(shù)據(jù)顯示的是分組后的第一行數(shù)據(jù)
在ORACLE中 select 是嚴(yán)格的 只能顯示group by 中的字段。
同樣效果的兩行sql --- 讓自己注意提高自己的使用靈活性
1. select a.aid AAid,nvl(b.cot,0) countline from po_draft_order a,(select AID_DRAFT_ORDER_PO BAID,count(*) cot from po_draft_line group by AID_DRAFT_ORDER_PO) b WHERE A.AID = B.BAID(+);
2. select a.aid, (select count(*) from po_draft_line where AID_DRAFT_ORDER_PO = a.aid ) c from po_draft_order a;
-------------------------------------------------------------------------------------------------------------------------------
oracle 分級
rank()/dense_rank() over(partition by ... order by ...) 加強對分組排序之后的數(shù)據(jù)的控制力。
over: over(...)
partition by : 相當(dāng)于group by
order by e.sal desc: 按工資從高到低排序(使用rank()/dense_rank() 時,必須要帶order by否則非法)
rank()/dense_rank(): 分級
整個語句的意思就是:在按部門劃分的基礎(chǔ)上,按工資從高到低對雇員進行分級,“級別”由從小到大的數(shù)字表示(最小值一定為1)。
那么rank()和dense_rank()有什么區(qū)別呢?
rank(): 跳躍排序,如果有兩個第一級時,接下來就是第三級。
dense_rank(): 連續(xù)排序,如果有兩個第一級時,接下來仍然是第二級。
min()/max() over(partition by ...) // 分組最大最小值
lead()/lag() over(partition by order by) // 前后數(shù)據(jù)比較使用
lead(列名,n,m): 當(dāng)前記錄后面第n行記錄的<列名>的值,沒有則默認值為m;如果不帶參數(shù)n,m,則查找當(dāng)前記錄后面第一行的記錄<列名>的值,沒有則默認值為null。
lag(列名,n,m): 當(dāng)前記錄前面第n行記錄的<列名>的值,沒有則默認值為m;如果不帶參數(shù)n,m,則查找當(dāng)前記錄前面第一行的記錄<列名>的值,沒有則默認值為null。
主要是各個函數(shù)和over的配合使用。
-----------------------------------------------------------------------------------------------------------------------------------------------------
Oracle 的集合運算
UNION 用來合并結(jié)果集 要求返回字段是一樣的。
JOIN 用來合并字段。
并集
UNION ALL, FULL JOIN -- 重復(fù)出現(xiàn)
UNION, INNER JOIN minus -- 一次出現(xiàn)
交集
差集
笛卡爾積
CROSS JOIN
------------------------------------------------------------------------------------------------------------------------------
INNER JOIN oracle 特殊的寫法 不知道在sqlserver 是否支持。
SELECT
*
FROM (
SO_WEC_SODL_DESPATCH_HEADER AS SO_WEC_SODL_DESPATCH_HEADER_1
INNER JOIN (
(
SO_WARRANTY_ENTITLEMENT WET_1
INNER JOIN (SO_WARRANTY_ENTITLEMENT INNER JOIN SO_WEC_SODL
ON SO_WARRANTY_ENTITLEMENT.AID = SO_WEC_SODL.AID_WARRANTY_ENTITLEMENT_SO
) ON (WET_1.AID_COMPANY = SO_WARRANTY_ENTITLEMENT.AID_COMPANY)
AND (WET_1.SEQ_ITEM_NUM = SO_WARRANTY_ENTITLEMENT.PARENT_SEQ_ITEM)
AND (WET_1.ITEM_LINE_NUM = SO_WARRANTY_ENTITLEMENT.PARENT_ITEM_NUM)
AND (WET_1.SO_LINE_NUM = SO_WARRANTY_ENTITLEMENT.PARENT_SOLINE_NUM)
AND (WET_1.SO_NUM = SO_WARRANTY_ENTITLEMENT.SO_NUM)
)
INNER JOIN SO_WEC_SODL AS SO_WEC_SODL_1 ON (SO_WEC_SODL.LINE_DELIVERY_NUMBER = SO_WEC_SODL_1.LINE_DELIVERY_NUMBER)
AND (WET_1.AID = SO_WEC_SODL_1.AID_WARRANTY_ENTITLEMENT)
) ON SO_WEC_SODL_DESPATCH_HEADER_1.AID_WEC_SODL = SO_WEC_SODL_1.AID
) INNER JOIN SO_WEC_SODL_DESPATCH_HEADER ON SO_WEC_SODL.AID = SO_WEC_SODL_DESPATCH_HEADER.AID_WEC_SODL
===