(感谢dingjun123版主 为本文提供帮助)
union怎么排序?
许多人肯定会说 根据第一字段来排序,呵呵,这个答案能得50分!考虑到如果select的第一个字段是重复时,会怎样?看一个测试!
SQL> select 1 id ,'a1' val ,'b1' text from dual
2 union
3 select 1 ,'a1' ,'b3' from dual
4 union
5 select 1 ,'a1' ,'b2' from dual;
ID VA TE
---------- -- --
1 a1 b1
1 a1 b2
1 a1 b3 --每个字段都有排序的。
从上面的结果可以看出,显然这不是根据第一字段来排序的,再看下一个:
SQL> select 1 id ,'a1' val ,'b1' text from dual
2 union
3 select 1 ,'a1' ,'b3' from dual
4 union
5 select 1 ,'a1' ,'b2' from dual
6 union
7 select 1 ,'a2' ,'b3' from dual
8 union
9 select 1 ,'a2' ,'b1' from dual
10 union
11 select 1 ,'a2' ,'b2' from dual;
ID VA TE
---------- -- --
1 a1 b1
1 a1 b2
1 a1 b3
1 a2 b1
1 a2 b2
1 a2 b3
已选择6行。
基本上从这里可以得出 union 执行的排序是全量排序,即对select 语句所包含的所有字段进行排序!
再次验证一下:
SQL> select 1 id ,'a1' val ,'b1' text from dual
2 union
3 select 1 ,'a1' ,'b3' from dual
4 union
5 select 1 ,'a1' ,'b2' from dual
6 union
7 select 1 ,'a2' ,'b3' from dual
8 union
9 select 1 ,'a2' ,'b1' from dual
10 union
11 select 1 ,'a2' ,'b2' from dual
12 union
13 select 2 ,'a1' ,'b2' from dual
14 union
15 select 2 ,'a2' ,'b1' from dual
16 union
17 select 2 ,'a2' ,'b2' from dual
18 union
19 select 2 ,'a2' ,'b3' from dual
20 union
21 select 3 ,'a2' ,'b3' from dual
22 union
23 select 3 ,'a1' ,'b2' from dual;
ID VA TE
---------- -- --
1 a1 b1
1 a1 b2
1 a1 b3
1 a2 b1
1 a2 b2
1 a2 b3
2 a1 b2
2 a2 b1
2 a2 b2
2 a2 b3
3 a1 b2
3 a2 b3 ---可以看出每个字段有排序了!所以union是全量排序的~!
已选择12行。
另外,minus,intersect的排序也是按所有列出现的顺序全量排序!