一程序員家的水管壞了,他打電話叫來(lái)一個(gè)水管工修理。 水管工鼓搗了一個(gè)小時(shí),終于把管子修好了,他遞給程序員一張600元的帳單。 “600元!”程序員憤怒地說(shuō):“我當(dāng)程序員一天都賺不了這么多錢!” “是啊。”水管工平靜地說(shuō),“我當(dāng)程序員的時(shí)候也是。”
posted @ 2012-10-29 14:04 a_alter 閱讀(556) | 評(píng)論 (0) | 編輯 收藏
posts - 8, comments - 0, trackbacks - 0, articles - 11 |
||
一程序員家的水管壞了,他打電話叫來(lái)一個(gè)水管工修理。 水管工鼓搗了一個(gè)小時(shí),終于把管子修好了,他遞給程序員一張600元的帳單。 “600元!”程序員憤怒地說(shuō):“我當(dāng)程序員一天都賺不了這么多錢!” “是啊。”水管工平靜地說(shuō),“我當(dāng)程序員的時(shí)候也是。” posted @ 2012-10-29 14:04 a_alter 閱讀(556) | 評(píng)論 (0) | 編輯 收藏 例 如下
表 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í)別的條篩選 Select * from A,B,C,D where A.B_AID = B.AID(+) and B.C_AID = C.AID and C.D_AID = D.AID; 這個(gè)時(shí)候測(cè)試效果就是 D 級(jí)別的join條件 會(huì)破壞 B的left join 效果。這樣的D級(jí)別的篩選就會(huì)破壞B級(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; 可惜我測(cè)試結(jié)果和full join 的效果是一樣的,不是oracle高手, 誰(shuí)知道的留個(gè)言火鏈接 謝謝 ======================================================================= 后來(lái)找同學(xué)幫忙 得知他以前也遇到這情況 改寫為如下條件 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(+) 效果。 個(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) | 編輯 收藏 |
||