oracle里面的minus,换到sql2000里面是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle里面的minus,换到sql2000里面是啥?相关的知识,希望对你有一定的参考价值。

举例:
select count(*) as “次数”
from ( (select callid from 日志表
where 查询条件1
group by callid
minus (select id from 日志表 where
查询条件2
) );

SqlServer2005中开始使用 【execpt】 实现和 oracle中 【minus】一样的功能,但是SqlServer2000中并不支持 【execpt】只能用【not exists】实现。

select count(*) as “次数”
from (
(select callid from 日志表 where 查询条件1 group by callid
not exists
(select id from 日志表 where 查询条件2 ))t;

值得注意的是SqlServer中使用子查询的时候必须要给子查询起名字,就像上面的【t】,否则会报错。

---
以上,希望对你有所帮助。
参考技术A select count(distinct myID ) as “次数”
from (
(select callid as myID from 日志表
where 查询条件1
group by callid
union all
select id as myID from 日志表 where 查询条件2
)
) as myTable
参考技术B sql server是不支持minus的!

可以考虑使用not exist

Oracle sql语句 minus函数执行效率与join对比

我们经常会对select结果进行对比,常用的函数如minus, 那么当两张表数据量较大时,有什么方式可以提高效率呢?

minus 方式
minus 执行计划如下所示, 通过排序后再进行对比
select object_id from t2 minus select object_id from t1;
..
2255 rows selected.
Elapsed: 00:00:00.93
Execution Plan

Plan hash value: 1578327006

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 102K| 2357K| | 1318 (1)| 00:00:16 |
| 1 | MINUS | | | | | | |
| 2 | SORT UNIQUE | | 102K| 1304K| 2024K| 861 (1)| 00:00:11 |
| 3 | TABLE ACCESS FULL | T2 | 102K| 1304K| | 371 (1)| 00:00:05 |
| 4 | SORT UNIQUE | | 82926 | 1052K| 1640K| 457 (1)| 00:00:06 |
| 5 | INDEX FAST FULL SCAN| T1_IDX | 82926 | 1052K| | 60 (0)| 00:00:01 |

Note

  • dynamic sampling used for this statement (level=2)

Statistics

  9  recursive calls   --递归
  0  db block gets
   1681  consistent gets
   1798  physical reads
  0  redo size
  41734  bytes sent via SQL*Net to client
   2173  bytes received via SQL*Net from client
152  SQL*Net roundtrips to/from client
  2  sorts (memory)
  0  sorts (disk)
   2255  rows processed

使用join方式替代
尤其数据量越大的情况下,join方式,不排序,走的hash算法,执行游戏效率会更好
alter system flush buffer cache;
select t2.object_id t2_id from t1 right join t2 on t1.object_id=t2.object_id where t1.object_id is null;
2255 rows selected.
Elapsed: 00:00:00.56
Execution Plan

Plan hash value: 4276371593

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 102K| 2609K| | 653 (1)| 00:00:08 |
|* 1 | HASH JOIN RIGHT ANTI | | 102K| 2609K| 2032K| 653 (1)| 00:00:08 |
| 2 | INDEX FAST FULL SCAN| T1_IDX | 82926 | 1052K| | 60 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | T2 | 102K| 1304K| | 371 (1)| 00:00:05 |

Predicate Information (identified by operation id):

1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
Note

  • dynamic sampling used for this statement (level=2)

Statistics

  0  recursive calls    --没有递归游戏调用
  0  db block gets
   1692  consistent gets
   1534  physical reads
  0  redo size
  41730  bytes sent via SQL*Net to client
   2173  bytes received via SQL*Net from client
152  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
   2255  rows processed

以上是关于oracle里面的minus,换到sql2000里面是啥?的主要内容,如果未能解决你的问题,请参考以下文章

oracle里面Union和minus的问题

Oracle Minus关键字

Oracle sql语句 minus函数执行效率与join对比

ORACLE MINUS 关键字的 ANSI SQL 标准

oracle的minus怎么使用?

oracle的minus怎么使用?