在以前的版本中,我们将 ALL 关键字添加到 UNION 以防止删除重复值,从而提高性能。在 Oracle 21C 中,ALL 关键字也可以添加到 MINUS 和 INTERSECT 运算符,因此它们的操作是基于相同行的,而不是基于不同行的。 Oracle 21C 还引入了 EXCEPT 和 EXCEPT ALL 运算符,它们在功能上分别等同于 MINUS 和 MINUS ALL。
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 10 ACCOUNTING 10 ACCOUNTING 20 RESEARCH 20 RESEARCH 30 SALES 30 SALES
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 minus select department_id, department_name from departments where department_id >= 20 orderby 1;
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 minus all select department_id, department_name from departments where department_id >= 20 orderby 1;
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 minus all select department_id, department_name from d1 where department_id >= 20 orderby 1;
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 10 ACCOUNTING 10 ACCOUNTING 20 RESEARCH 20 RESEARCH 30 SALES 30 SALES
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 intersect select department_id, department_name from departments where department_id >= 20 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 20 RESEARCH 30 SALES
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 intersect all select department_id, department_name from departments where department_id >= 20 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 20 RESEARCH 30 SALES
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 intersect all select department_id, department_name from d1 where department_id >= 20 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 20 RESEARCH 20 RESEARCH 30 SALES 30 SALES
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 intersect select department_id, department_name from d1 where department_id >= 20 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 20 RESEARCH 30 SALES
select department_id, department_name from departments where department_id <= 30 except select department_id, department_name from departments where department_id >= 20 order by 1;
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 orderby 1;
DEPARTMENT_ID DEPARTMENT_NAM ------------- -------------- 10 ACCOUNTING 10 ACCOUNTING 20 RESEARCH 20 RESEARCH 30 SALES 30 SALES
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 expect select department_id, department_name from departments where department_id >= 20 orderby 1;
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 expect all select department_id, department_name from departments where department_id >= 20 orderby 1;
with d1 as ( select department_id, department_name from departments union all select department_id, department_name from departments ) select department_id, department_name from d1 where department_id <= 30 except all select department_id, department_name from d1 where department_id >= 20 orderby 1;