
minus指令最后有;吗
一:MINUS指令 其是运用在两个 SQL 语句上它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL语句的结果中如果有的话,那第一个SQL结果数据就被去除,而不会在最后的结果中出现如果第一个 SQL 语句所产生的结果并没有存在于第二个 SQL 语句所产生的结果内,那第一个SQL结果数据就被保留,会在最后的结果中出现
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,否则会报错。
---
以上,希望对你有所帮助。
EXCEPT和MINUS *** 作符
数据库程序设计的目标就是最大限度地减少需要通过网络传送的数据量 并消除客户端不必要的处理过程 也就是说 只向RDBMS请求需要的数据 不触动其余任何之物 INTERSECT *** 作符可以求取两个查询结果的交集 而EXCEPT *** 作符则用于求取两个查询结果的差集
INTERSECT *** 作符和EXCEPT *** 作符是一种便利的表示方式 可以使用INNER JOIN和OUTER JOIN来分别替代它们(加上某些调整 消除重复的记录)
在上面的例子中 如果使用EXCEPT *** 作符代替INTERSECT *** 作符 查询结果将显示在书柜上还没有分配到位置的所有图书(即在LOCATION表中没有相应的记录)
SELECT bk_id FROM books
EXCEPT
SELECT fk_bk_loc FROM location;
bk_id
( row(s) affected)
该查询仅返回在BOOKS表中存在的同时在LOCATION表中不存在相应记录的记录 在本章结尾的练习中将尝试使用INTERSECT *** 作符和EXCEPT *** 作符
可以使用NOT EXISTS *** 作符和相关子查询来代替EXCEPT(或MINUS)关键字 虽然没有获得SQL标准委员会的官方支持 但所有RDBMS都支持这种语法(除了在OpenOffice中作为嵌入式RDBMS的HSQLDB例外)
DB Microsoft SQL Server和PostgreSQL都实现了EXCEPT关键字 Oracle则使用MINUS关键字 MySQL和HSQLDB既支持EXCEPT *** 作符 又支持MINUS关键字 Microsoft Access对两者都不支持
试一试求取数据集的差集
为了进一步观察数据集 *** 作符(例如INTERSECT *** 作符和EXCEPT *** 作符)的使用 下面将在已经完美匹配的数据中添加一些新数据 在本章之前讨论LEFT OUTER JOIN时已经执行过类似的 *** 作 在下面的练习中可以再次使用相同的记录
接下来将在BOOKS表中添加一条不匹配的记录 用于演示INTERSECT *** 作符和EXCEPT *** 作符的应用
( ) 打开Microsoft SQL Server Management Studio 使用Windows身份验证连接到数据库
( ) 单击位于左上角的New Query按钮
( ) 在打开的查询窗口(中间的窗格)中输入下面的SQL查询
INSERT INTO books (bk_id bk_title)
VALUES ( UNMATCHED RECORD )
( ) 现在BOOKS表中已经具有一条新记录 该记录在LOCATION表中没有对应的位置 此时使用INTERSECT *** 作符和EXCEPT *** 作符将查询到什么结果呢?首先 执行一个使用INTERSECT *** 作符的查询
SELECT bk_id FROM books
INTERSECT
SELECT fk_bk_loc FROM location;
( ) 可以预见 该查询只会返回 条记录 BOOKS表与LOCATION表中都匹配的记录
( ) 运行使用EXCEPT *** 作符的查询将产生一个不同的结果
SELECT bk_id FROM books
EXCEPT
SELECT fk_bk_loc FROM location;
bk_id
( row(s) affected)
示例说明
在将一条新记录插入到BOOKS表之后 BOOKS表中包含了 条记录 但只有 条记录在LOCATION表中具有相匹配的记录 这模拟了买到一本新书但还没有在书柜中分配图书摆放位置的情形 INTERSECT *** 作符仅返回那些在两个表中都匹配的记录 因此 BK_ID = 的记录将被排除在外
当运行EXCEPT查询时 将分别从BOOKS表和LOCATION表中抽取匹配的记录 并将不匹配的记录返回 在本例中 不匹配的记录就是新插入的UNMATCHED RECORD这条记录
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16454
我用SQL语句没有完成你想要的效果,我写了一个function可以完成。我已经在Oracle10g中测试过了。我建了两个表a1和a2就一列,CREATE TABLE a1(aa varchar2(10)) 值和你的一样,下面是函数语句。选创建一个表类型 create or replace type t_table is table of VARCHAR2(10);
CREATE OR REPLACE FUNCTION ATEST RETURN T_TABLE AS
RES T_TABLE := T_TABLE();
CURSOR CUR_A2 IS
SELECT AA, COUNT() BB FROM A2 group by aa;
ACHAR VARCHAR2(10);
ACOUNT INT;
ATEMP INT;
I INT;
BEGIN
i:=1;
FOR CA2 IN CUR_A2 LOOP
SELECT AA, COUNT() INTO ACHAR, ACOUNT FROM A1 WHERE AA = CA2AA group by aa;
ATEMP := ACOUNT - CA2BB;
IF ATEMP > 0 THEN
LOOP
RESExtend;
RES(I) := ACHAR;
I := I + 1;
ATEMP := ATEMP - 1;
IF ATEMP = 0 THEN
EXIT;
END IF;
END LOOP;
END IF;
END LOOP;
RETURN RES;
END;
函数调用时 SELECT atest FROM dual; 即可
麻烦虽麻烦了点但可以完成你的要求,希望能帮到你
以上就是关于minus指令最后有;吗全部的内容,包括:minus指令最后有;吗、oracle里面的minus,换到sql2000里面是什么、SQL实战新手入门:EXCEPT和MINUS *** 作符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)