作者yscgk (中山的游客)
看板Database
标题Re: [SQL ] 新手求助巢状No exists
时间Fri Aug 1 20:46:21 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/Database/M.1406897183.A.D44.html
1F:→ bohei:等等....你最里面的s跟p到底是指哪儿的s跟p? 08/01 21:17
2F:→ bohei:你先试着把table都给别名,不然连自己在写什麽都混乱了, 08/01 21:22
3F:→ bohei:又要怎麽去解读SELECT後的结果呢 08/01 21:22
4F:→ bohei:另外,execution plan可以看SQL细部的计画 08/01 21:29
刚刚试了一下
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
5F:→ bohei:你最後的例子,就是一开始讲的那样吧,你应该去看一下 08/01 23:54
6F:→ bohei:EXISTS是怎麽决定是否让主SELEC回传的 08/01 23:54
谢谢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
7F:→ bohei:三层分别以1.2.3来表示好了,我一开始就以为你的意思是 08/02 00:19
8F:→ bohei:1与2连结 2与3连结,所以我没考虑到1直接跟3,这部分我不确定 08/02 00:20
9F:→ yscgk:新手上路.有时我也不知我在做啥..可以安心睡了~谢谢你 08/02 00:23