posted @ 2012-10-29 14:04 a_alter 閱讀(556) | 評論 (0) | 編輯 收藏
表 A
(1--->n) 表B (B 可能為空)
(n---->n)表C
現在有如下問題 在查詢的時候我們允許b為空的A數據
Select * from A,B where A.B_AID = B.AID(+)
擴展查詢 如果進行B關聯C級別的條件過濾
這個時候C能夠知道B是可以為空的, 這個時候的join效果是, 如果在A關聯B B存在的情況下 在使用 C的join 條件進行篩選。 這個時候B為空的A條件還是可以擺查出來的。 只不過數據列B為空而已
再進行擴展篩選 進行C關聯D級別的條篩選
這樣的D級別的篩選就會破壞B級別的賽選。
你可能想到改寫條件如下
Select * from A,B,C,D where A.B_AID = B.AID(+) and B.C_AID = C.AID and C.D_AID(+) = D.AID;
可惜我測試結果和full join 的效果是一樣的,不是oracle高手, 誰知道的留個言火鏈接 謝謝
=======================================================================
后來找同學幫忙 得知他以前也遇到這情況
改寫為如下條件
這樣就不會破壞B(+) 效果。
個人理解就是 select 的組織數據效果。具體不清楚 歡迎發言。
=======================================================================
補充:
今天我才知道 left join 和 inner join 欄位是否必填還有關系。
在這個問題上有個地方被欺騙了
就是在 A Left join B inner JOIN C 的時候 如果 B 的 C 字段是必填的話 那么就相當于 left join。 如果不是必填的話 你必須手動的指示 left join (+) 。
=====================================================================
補充 2012/10/19 發現以上的理解不全面
A--B(+) 意思指B 端可為空, 如果 對B -- C 下面的元素進行賽選, 在局部看 B 和 C 的關系是兩段都必須存在的, 但是在A -- B(+) 的前提下 C可以為空的, 所以需要使用 B --- C(+) 來進行關聯 這樣的壞處是可能會加載出 B (存在)-- C (不存在) 這樣的錯誤數據。 當然如果系統中有對這種數據有確實保障的時候可以忽略該問題
如果沒有確切的保障的話
可能就需要使用 A --- D(+) 其中D 為 select * from B,C where B = C 這樣的過濾方式, 但是這樣就增加了復雜度, 你需要將可能用到的查詢條件和查詢結果集在D中 select 一一列出來
在 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 復雜度高了一點。
posted @ 2012-10-09 10:15 a_alter 閱讀(633) | 評論 (0) | 編輯 收藏
------------------------------------------------------------------------------------------------------------------------------
INNER JOIN oracle 特殊的寫法 不知道在sqlserver 是否支持。
*
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) | 評論 (0) | 編輯 收藏
posted @ 2012-09-10 17:20 a_alter 閱讀(345) | 評論 (0) | 編輯 收藏
是針對項目設定的, 右擊項目選擇 Properties --》 Project Facets 勾選你需要使用的 schema定義、
posted @ 2012-09-07 14:30 a_alter 閱讀(469) | 評論 (0) | 編輯 收藏
用了seam也快一年了, 可惜一直是在做開發, 今天決定回頭總結下, 并且去看一下JSF , SEAM 的配置。
seam 簡單介紹
直接看英文吧, 翻譯的不行
Seam is a powerful open source development platform for building rich Internet applications in Java. Seam integrates technologies such as Asynchronous JavaScript and XML (AJAX), JavaServer Faces (JSF), Java Persistence (JPA), Enterprise Java Beans (EJB 3.0) and Business Process Management (BPM) into a unified full-stack solution, complete with sophisticated tooling.
Seam has been designed from the ground up to eliminate complexity at both architecture and API levels. It enables developers to assemble complex web applications using simple annotated Java classes, a rich set of UI components, and very little XML. Seam's unique support for conversations and declarative state management can introduce a more sophisticated user experience while at the same time eliminating common bugs found in traditional web applications.
我們可以看到seam 和 jsf,jpa,ejb 結合比較緊密,提供了annotation 方式支持, 提供了大量的 ui components 支持。
想說的一點是, seam不是一個框架, 而是一個平臺。
附:
JSF 資料查詢 http://caterpillar.onlyfun.net/Gossip/JSF/IntroduceJSF.htm
posted @ 2012-08-30 09:38 a_alter 閱讀(196) | 評論 (0) | 編輯 收藏