posted @ 2012-10-29 14:04 a_alter 閱讀(556) | 評(píng)論 (0) | 編輯 收藏
一程序員家的水管壞了,他打電話叫來(lái)一個(gè)水管工修理。 水管工鼓搗了一個(gè)小時(shí),終于把管子修好了,他遞給程序員一張600元的帳單。 “600元!”程序員憤怒地說(shuō):“我當(dāng)程序員一天都賺不了這么多錢(qián)!” “是啊。”水管工平靜地說(shuō),“我當(dāng)程序員的時(shí)候也是。”
例 如下
表 A
(1--->n) 表B (B 可能為空)
(n---->n)表C
現(xiàn)在有如下問(wèn)題 在查詢的時(shí)候我們?cè)试Sb為空的A數(shù)據(jù)
Select * from A,B where A.B_AID = B.AID(+)
擴(kuò)展查詢 如果進(jìn)行B關(guān)聯(lián)C級(jí)別的條件過(guò)濾
=======================================================================
補(bǔ)充:
今天我才知道 left join 和 inner join 欄位是否必填還有關(guān)系。
在這個(gè)問(wèn)題上有個(gè)地方被欺騙了
就是在 A Left join B inner JOIN C 的時(shí)候 如果 B 的 C 字段是必填的話 那么就相當(dāng)于 left join。 如果不是必填的話 你必須手動(dòng)的指示 left join (+) 。
=====================================================================
補(bǔ)充 2012/10/19 發(fā)現(xiàn)以上的理解不全面
A--B(+) 意思指B 端可為空, 如果 對(duì)B -- C 下面的元素進(jìn)行賽選, 在局部看 B 和 C 的關(guān)系是兩段都必須存在的, 但是在A -- B(+) 的前提下 C可以為空的, 所以需要使用 B --- C(+) 來(lái)進(jìn)行關(guān)聯(lián) 這樣的壞處是可能會(huì)加載出 B (存在)-- C (不存在) 這樣的錯(cuò)誤數(shù)據(jù)。 當(dāng)然如果系統(tǒng)中有對(duì)這種數(shù)據(jù)有確實(shí)保障的時(shí)候可以忽略該問(wèn)題
如果沒(méi)有確切的保障的話
可能就需要使用 A --- D(+) 其中D 為 select * from B,C where B = C 這樣的過(guò)濾方式, 但是這樣就增加了復(fù)雜度, 你需要將可能用到的查詢條件和查詢結(jié)果集在D中 select 一一列出來(lái)
在 Select A.*,R1,R2,R3 from A ,(select B.A_Aid,c1,c2,c3,R1,R2,R3 from B,C where B.C_AID= C.Aid) D where A.Aid = B.A_Aid and c1 = ? and c2 = ? ....
Sql 復(fù)雜度高了一點(diǎn)。
表 A
(1--->n) 表B (B 可能為空)
(n---->n)表C
(n---->n)表D
現(xiàn)在有如下問(wèn)題 在查詢的時(shí)候我們?cè)试Sb為空的A數(shù)據(jù)
Select * from A,B where A.B_AID = B.AID(+)
擴(kuò)展查詢 如果進(jìn)行B關(guān)聯(lián)C級(jí)別的條件過(guò)濾
Select * from A,B, C where A.B_AID = B.AID(+) and B.C_AID = C.AID;
這個(gè)時(shí)候C能夠知道B是可以為空的, 這個(gè)時(shí)候的join效果是, 如果在A關(guān)聯(lián)B B存在的情況下 在使用 C的join 條件進(jìn)行篩選。 這個(gè)時(shí)候B為空的A條件還是可以擺查出來(lái)的。 只不過(guò)數(shù)據(jù)列B為空而已
再進(jìn)行擴(kuò)展篩選 進(jìn)行C關(guān)聯(lián)D級(jí)別的條篩選
你可能想到改寫(xiě)條件如下
Select * from A,B,C,D where A.B_AID = B.AID(+) and B.C_AID = C.AID and C.D_AID(+) = D.AID;
可惜我測(cè)試結(jié)果和full join 的效果是一樣的,不是oracle高手, 誰(shuí)知道的留個(gè)言火鏈接 謝謝
=======================================================================
后來(lái)找同學(xué)幫忙 得知他以前也遇到這情況
改寫(xiě)為如下條件
個(gè)人理解就是 select 的組織數(shù)據(jù)效果。具體不清楚 歡迎發(fā)言。
這個(gè)時(shí)候C能夠知道B是可以為空的, 這個(gè)時(shí)候的join效果是, 如果在A關(guān)聯(lián)B B存在的情況下 在使用 C的join 條件進(jìn)行篩選。 這個(gè)時(shí)候B為空的A條件還是可以擺查出來(lái)的。 只不過(guò)數(shù)據(jù)列B為空而已
再進(jìn)行擴(kuò)展篩選 進(jìn)行C關(guān)聯(lián)D級(jí)別的條篩選
Select * from A,B,C,D where A.B_AID = B.AID(+) and B.C_AID = C.AID and C.D_AID = D.AID;
這樣的D級(jí)別的篩選就會(huì)破壞B級(jí)別的賽選。
這個(gè)時(shí)候測(cè)試效果就是 D 級(jí)別的join條件 會(huì)破壞 B的left join 效果。這樣的D級(jí)別的篩選就會(huì)破壞B級(jí)別的賽選。
你可能想到改寫(xiě)條件如下
Select * from A,B,C,D where A.B_AID = B.AID(+) and B.C_AID = C.AID and C.D_AID(+) = D.AID;
可惜我測(cè)試結(jié)果和full join 的效果是一樣的,不是oracle高手, 誰(shuí)知道的留個(gè)言火鏈接 謝謝
=======================================================================
后來(lái)找同學(xué)幫忙 得知他以前也遇到這情況
改寫(xiě)為如下條件
select * from (Select ....,C.D_AID from A,B,C where A.B_AID = B.AID(+) and B.C_AID = C.AID ) E,D where E.D_AID(+) = D.AID
這樣就不會(huì)破壞B(+) 效果。
這樣就不會(huì)破壞B(+) 效果。
個(gè)人理解就是 select 的組織數(shù)據(jù)效果。具體不清楚 歡迎發(fā)言。
=======================================================================
補(bǔ)充:
今天我才知道 left join 和 inner join 欄位是否必填還有關(guān)系。
在這個(gè)問(wèn)題上有個(gè)地方被欺騙了
就是在 A Left join B inner JOIN C 的時(shí)候 如果 B 的 C 字段是必填的話 那么就相當(dāng)于 left join。 如果不是必填的話 你必須手動(dòng)的指示 left join (+) 。
=====================================================================
補(bǔ)充 2012/10/19 發(fā)現(xiàn)以上的理解不全面
A--B(+) 意思指B 端可為空, 如果 對(duì)B -- C 下面的元素進(jìn)行賽選, 在局部看 B 和 C 的關(guān)系是兩段都必須存在的, 但是在A -- B(+) 的前提下 C可以為空的, 所以需要使用 B --- C(+) 來(lái)進(jìn)行關(guān)聯(lián) 這樣的壞處是可能會(huì)加載出 B (存在)-- C (不存在) 這樣的錯(cuò)誤數(shù)據(jù)。 當(dāng)然如果系統(tǒng)中有對(duì)這種數(shù)據(jù)有確實(shí)保障的時(shí)候可以忽略該問(wèn)題
如果沒(méi)有確切的保障的話
可能就需要使用 A --- D(+) 其中D 為 select * from B,C where B = C 這樣的過(guò)濾方式, 但是這樣就增加了復(fù)雜度, 你需要將可能用到的查詢條件和查詢結(jié)果集在D中 select 一一列出來(lái)
在 Select A.*,R1,R2,R3 from A ,(select B.A_Aid,c1,c2,c3,R1,R2,R3 from B,C where B.C_AID= C.Aid) D where A.Aid = B.A_Aid and c1 = ? and c2 = ? ....
Sql 復(fù)雜度高了一點(diǎn)。
posted @ 2012-10-09 10:15 a_alter 閱讀(633) | 評(píng)論 (0) | 編輯 收藏
本文用途:因?yàn)闀簳r(shí)沒(méi)有時(shí)間去具體看oracle sql的官方文檔 ,紀(jì)錄oracle的一些特殊寫(xiě)法。 (不斷更新)
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中的支持正則表達(dá)式的函數(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 分級(jí)
rank()/dense_rank() over(partition by ... order by ...) 加強(qiáng)對(duì)分組排序之后的數(shù)據(jù)的控制力。
over: over(...)
partition by : 相當(dāng)于group by
order by e.sal desc: 按工資從高到低排序(使用rank()/dense_rank() 時(shí),必須要帶order by否則非法)
rank()/dense_rank(): 分級(jí)
整個(gè)語(yǔ)句的意思就是:在按部門(mén)劃分的基礎(chǔ)上,按工資從高到低對(duì)雇員進(jìn)行分級(jí),“級(jí)別”由從小到大的數(shù)字表示(最小值一定為1)。
那么rank()和dense_rank()有什么區(qū)別呢?
rank(): 跳躍排序,如果有兩個(gè)第一級(jí)時(shí),接下來(lái)就是第三級(jí)。
dense_rank(): 連續(xù)排序,如果有兩個(gè)第一級(jí)時(shí),接下來(lái)仍然是第二級(jí)。
min()/max() over(partition by ...) // 分組最大最小值
lead()/lag() over(partition by order by) // 前后數(shù)據(jù)比較使用
lead(列名,n,m): 當(dāng)前記錄后面第n行記錄的<列名>的值,沒(méi)有則默認(rèn)值為m;如果不帶參數(shù)n,m,則查找當(dāng)前記錄后面第一行的記錄<列名>的值,沒(méi)有則默認(rèn)值為null。
lag(列名,n,m): 當(dāng)前記錄前面第n行記錄的<列名>的值,沒(méi)有則默認(rèn)值為m;如果不帶參數(shù)n,m,則查找當(dāng)前記錄前面第一行的記錄<列名>的值,沒(méi)有則默認(rèn)值為null。
主要是各個(gè)函數(shù)和over的配合使用。
-----------------------------------------------------------------------------------------------------------------------------------------------------
Oracle 的集合運(yùn)算
UNION 用來(lái)合并結(jié)果集 要求返回字段是一樣的。
JOIN 用來(lái)合并字段。
并集
UNION ALL, FULL JOIN -- 重復(fù)出現(xiàn)
UNION, INNER JOIN minus -- 一次出現(xiàn)
交集
intersect
差集
minus
笛卡爾積
CROSS JOIN
------------------------------------------------------------------------------------------------------------------------------
INNER JOIN oracle 特殊的寫(xiě)法 不知道在sqlserver 是否支持。
===
------------------------------------------------------------------------------------------------------------------------------
INNER JOIN oracle 特殊的寫(xiě)法 不知道在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
*
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
===
posted @ 2012-09-12 12:57 a_alter 閱讀(226) | 評(píng)論 (0) | 編輯 收藏
今天看Richface4.2文檔的時(shí)候 發(fā)現(xiàn)變動(dòng)很大 紀(jì)錄下
posted @ 2012-09-10 17:20 a_alter 閱讀(344) | 評(píng)論 (0) | 編輯 收藏