Re: [SQL ] 新手求助巢狀No exists

看板Database作者 (中山的遊客)時間9年前 (2014/08/01 20:46), 9年前編輯推噓0(009)
留言9則, 2人參與, 最新討論串3/4 (看更多)
※ 引述《bohei (run and fall)》之銘言: : 小弟是用Oracle的,所以不確定是不是100%一樣, : 第一層的EXISTS因為沒下任何跟外面相關連的條件, : 所以當有select row即視為TRUE,再遇到NOT,當然就變成FALSE : 你試著在第一層的EXISTS加上關聯條件,就可以得到不同的結果了~ : GO! 謝謝 剛剛試了一下 還是不太懂 然後之前 SELECT * FROM s, p, sp WHERE NOT EXISTS ( SELECT * FROM s WHERE NOT EXISTS ( SELECT * FROM sp WHERE s.s = sp.s AND p.p = sp.p ) ); 上面這一串 我只改了第一個Not exists裡的From 從s,p改成s 就跑出 Sname s PName p s p s1 1 p1 1 1 1 s2 2 p1 1 1 1 s1 1 p1 1 1 2 s2 2 p1 1 1 2 s1 1 p1 1 2 1 s2 2 p1 1 2 1 這樣的結果... 搞得我好亂阿= =" -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.238.195.54 ※ 文章網址: http://www.ptt.cc/bbs/Database/M.1406897183.A.D44.html

08/01 21:17, , 1F
等等....你最裡面的s跟p到底是指哪兒的s跟p?
08/01 21:17, 1F

08/01 21:22, , 2F
你先試著把table都給別名,不然連自己在寫什麼都混亂了,
08/01 21:22, 2F

08/01 21:22, , 3F
又要怎麼去解讀SELECT後的結果呢
08/01 21:22, 3F

08/01 21:29, , 4F
另外,execution plan可以看SQL細部的計畫
08/01 21:29, 4F
剛剛試了一下 EXPLAIN SELECT * FROM s, p, sp WHERE NOT EXISTS ( SELECT * FROM s AS ss, p AS pp WHERE NOT EXISTS ( SELECT * FROM sp WHERE s.s = sp.s AND p.p = sp.p ) ); 節錄輸出 id select_type table type key rows Extra 1 PRIMARY s ALL NULL 2 1 PRIMARY p ALL NULL 2 Using where 1 PRIMARY sp index PRIMARY 3 Using index 2 DEP~ SUBQUERY ss index PRIMARY 2 Using index 2 DEP~ SUBQUERY pp index PRIMARY 2 Using where;Using index 3 DEP~ SUBQUERY sp eq_ref PRIMARY 1 Using index 看來似乎是指向中間的s和p 只是小弟不才 看不太出來這說明了什麼....Orz ※ 編輯: yscgk (36.238.195.54), 08/01/2014 23:31:52 後來發現我裡面沒改 以下是改變的部分 EXPLAIN SELECT * FROM s, p, sp WHERE NOT EXISTS ( SELECT * FROM s AS ss, p AS pp WHERE NOT EXISTS ( SELECT * FROM sp AS spsp WHERE ss.s = spsp.s AND pp.p = spsp.p ) ); 輸出 id select_type table type key rows Extra 1 PRIMARY NULL NULL NULL NULL Impossible WHERE 2 SUBQUERY ss index PRIMARY 2 Using index 2 SUBQUERY pp index PRIMARY 2 Using where; Using index 3 DEP~ SUBQUERY spsp eq_ref PRIMARY 1 Using index 這個看起來就是輸出為空 不過有了這些 我也還是不會解釋 其實別名這問題一直困惑著我 別名後的Table 和原來的table是怎樣的情況阿... ※ 編輯: yscgk (36.238.195.54), 08/01/2014 23:45:31

08/01 23:54, , 5F
你最後的例子,就是一開始講的那樣吧,你應該去看一下
08/01 23:54, 5F

08/01 23:54, , 6F
EXISTS是怎麼決定是否讓主SELEC回傳的
08/01 23:54, 6F
謝謝bohei大大 大感謝 就如你所說的 我在兩個not exists內都加入了和外面的連結後(s.s=ss.s...etc) 就出現了滿意的結果 Sname s PName p s p s1 1 p1 1 1 1 s1 1 p2 2 1 2 s2 2 p1 1 2 1 所以說別名過後的table操作的狀況 和主select的table是沒關係的(不知道這樣說對不對) 真的謝謝bohei大大 ※ 編輯: yscgk (36.238.195.54), 08/02/2014 00:17:24

08/02 00:19, , 7F
三層分別以1.2.3來表示好了,我一開始就以為你的意思是
08/02 00:19, 7F

08/02 00:20, , 8F
1與2連結 2與3連結,所以我沒考慮到1直接跟3,這部分我不確定
08/02 00:20, 8F

08/02 00:23, , 9F
新手上路.有時我也不知我在做啥..可以安心睡了~謝謝你
08/02 00:23, 9F
文章代碼(AID): #1JsumVr4 (Database)
討論串 (同標題文章)
文章代碼(AID): #1JsumVr4 (Database)