SQL> select distinct nn from tt;NN ---------------------------------------------------------- aSQL> select nn from tt;NN ---------------------------------------------------------- a aSQL> select distinct rowid,nn from tt;ROWID NN ------------------ --------------------------------------- AAAlG/AAEAAAChmAAB a AAAlG/AAEAAAChmAAA a
查询结果一: NO NAME SALARY ROWID ---------- ---------- ---------- -------------------------------------------------------------------------------- 1 a 100 AAASTmAAFAAAAHnAAA 2 b 200 AAASTmAAFAAAAHnAAB 查询结果二: NO NAME SALARY ROWID ---------- ---------- ---------- -------------------------------------------------------------------------------- 1 a 100 AAASTmAAFAAAAHnAAA 2 b 200 AAASTmAAFAAAAHnAAB 3 c 300 AAASTmAAFAAAAHnAAC 3 c 300 AAASTmAAFAAAAHnAAD 3 c 300 AAASTmAAFAAAAHnAAE 3 c 300 AAASTmAAFAAAAHnAAF 3 c 300 AAASTmAAFAAAAHnAAG 3 c 300 AAASTmAAFAAAAHnAAH 3 c 300 AAASTmAAFAAAAHnAAI 对于这两个查询结果来说,minus是基于ROWID进行的,还是基于 * 进行的 如果是基于* 进行的,是不是先进行一次 查询结果二 对 查询结果一 做 集合减运算,得到结果三: 3 c 300 AAASTmAAFAAAAHnAAC 3 c 300 AAASTmAAFAAAAHnAAD 3 c 300 AAASTmAAFAAAAHnAAE 3 c 300 AAASTmAAFAAAAHnAAF 3 c 300 AAASTmAAFAAAAHnAAG 3 c 300 AAASTmAAFAAAAHnAAH 3 c 300 AAASTmAAFAAAAHnAAI 那么最后是怎么得到: NO NAME SALARY ---------- ---------- ---------- ---------- 1 3 c 300
Oracle会对minus后的结果集进行去重,即如果A中原本多条相同的记录数在进行A minus B后将会只剩一条对应的记录
我看了下执行计划,应该是在Minus之前就先去重了。
那么就是说通过minus是无法输出类似 NN ---------------------------------------------------------- a a 结果了?
那么就是说通过minus是无法输出类似 NN ---------------------------------------------------------- a a 结果了? 你到底是需要怎么样的minus,为什么需要返回两行?
那么就是说通过minus是无法输出类似 NN ---------------------------------------------------------- a a 结果了? 你到底是需要怎么样的minus,为什么需要返回两行?
想明白了,如下结果通过minus是没法得到的: NO NAME SALARY ---------- ---------- ---------- 3 c 300 3 c 300 3 c 300 3 c 300 3 c 300 3 c 300 3 c 300 问题原因我也想清楚了,是没有对MINUS的基本工作原理了解全面
加了rownum之后,每行的数据就不一样了(rownum列的值不相同)
因此执行minus之后会有不同的结果
很多人都知道ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较。但是却并不了解造成这种限制条件的机制是什么。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
其实ROWNUM的返回很简单,ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1。
理解了这一点,就清楚为什么一般的ROWNUM大于某个值或等于某个不为1的值是无法返回结果的,因此对于每条记录的ROWNUM都是1,而ROWNUM为1不满足查询的结果,所以下一条记录的ROWNUM不会递增,仍然是1,因此所有的记录都不满足条件
按照你说的做了一遍,可以了。
还想请教两个问题:
1.是不是说,minus对于一样的数据只会返回 一个?
2.一样的数据在存储的时候rowid是不一样的,那么minus是不能自动辨别的?
按照你说的做了一遍,可以了。
还想请教两个问题:
1.是不是说,minus对于一样的数据只会返回 一个?
2.一样的数据在存储的时候rowid是不一样的,那么minus是不能自动辨别的?
集合操作去重引起的
----------------------------------------------------------
aSQL> select nn from tt;NN
----------------------------------------------------------
a
aSQL> select distinct rowid,nn from tt;ROWID NN
------------------ ---------------------------------------
AAAlG/AAEAAAChmAAB a
AAAlG/AAEAAAChmAAA a
查询结果一:
NO NAME SALARY ROWID
---------- ---------- ---------- --------------------------------------------------------------------------------
1 a 100 AAASTmAAFAAAAHnAAA
2 b 200 AAASTmAAFAAAAHnAAB
查询结果二:
NO NAME SALARY ROWID
---------- ---------- ---------- --------------------------------------------------------------------------------
1 a 100 AAASTmAAFAAAAHnAAA
2 b 200 AAASTmAAFAAAAHnAAB
3 c 300 AAASTmAAFAAAAHnAAC
3 c 300 AAASTmAAFAAAAHnAAD
3 c 300 AAASTmAAFAAAAHnAAE
3 c 300 AAASTmAAFAAAAHnAAF
3 c 300 AAASTmAAFAAAAHnAAG
3 c 300 AAASTmAAFAAAAHnAAH
3 c 300 AAASTmAAFAAAAHnAAI
对于这两个查询结果来说,minus是基于ROWID进行的,还是基于 * 进行的
如果是基于* 进行的,是不是先进行一次 查询结果二 对 查询结果一 做 集合减运算,得到结果三:
3 c 300 AAASTmAAFAAAAHnAAC
3 c 300 AAASTmAAFAAAAHnAAD
3 c 300 AAASTmAAFAAAAHnAAE
3 c 300 AAASTmAAFAAAAHnAAF
3 c 300 AAASTmAAFAAAAHnAAG
3 c 300 AAASTmAAFAAAAHnAAH
3 c 300 AAASTmAAFAAAAHnAAI
那么最后是怎么得到:
NO NAME SALARY
---------- ---------- ---------- ----------
1 3 c 300
这就是为什么第一条sql只会返回一条数据
http://haohaoxuexi.iteye.com/blog/2095095
NN
----------------------------------------------------------
a
a
结果了?
NN
----------------------------------------------------------
a
a
结果了?
你到底是需要怎么样的minus,为什么需要返回两行?
NN
----------------------------------------------------------
a
a
结果了?
你到底是需要怎么样的minus,为什么需要返回两行?
想明白了,如下结果通过minus是没法得到的:
NO NAME SALARY
---------- ---------- ----------
3 c 300
3 c 300
3 c 300
3 c 300
3 c 300
3 c 300
3 c 300
问题原因我也想清楚了,是没有对MINUS的基本工作原理了解全面