• SQL SERVER: 合并相关操作(Union,Except,Intersect)


    SQL Server 中对于结果集有几个处理,值得讲解一下

    1. 并集(union,Union all)

    这个很简单,是把两个结果集水平合并起来。例如

    SELECT * FROM A

    UNION

    SELECT * FROM B

    【注意】union会删除重复值,也就是说A或B中重复的数据行,最终只会出现一次,而union all则会保留重复行。

    2. 差异(Except)

    就是两个集中不重复的部分。例如

    SELECT * FROM A

    EXCEPT

    SELECT * FROM B

    这个的意思是,凡是不出现在B表中的A表的行。

    【注意】except也会删除重复值,也就是说A中重复的数据行,最终只会出现一次,而且except不支持all语句

    3. 交集(intersect)

    就是两个集中共同的部分。例如

    SELECT * FROM A

    INTERSECT

    SELECT * FROM B

    这个的意思是,同时出现在A和B中的记录

    【注意】intersect也会删除重复值,也就是说同时出现在A和B中重复的数据行,最终只会出现一次,而且intersect也不支持all语句

    本文由作者:陈希章 于 2009/6/26 18:31:02 发布在:http://www.cnblogs.com/chenxizhang/ 本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心 本文是使用博客同步和管理系统自动于2009/6/26 18:31:04 从 陈希章@博客园 同步过来的。原文地址: http://www.cnblogs.com/chenxizhang/archive/2009/06/26/1511889.html ,发表于2009/6/26 10:31:00.

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chen_xizhang/archive/2009/06/26/4301621.aspx

    UNION, EXCEPT 和 INTERSECT使用方法:

    SQL中的UNION, EXCEPT 和 INTERSECT做下演示:

    这三个放在一起是有理由的,因为他们都是操作两个或多个结果集,并且这些结果集有如下限制:
    • 所有查询中的列数和列的顺序必须相同.
    • 数据类型必须兼容.

    并且它们都是处理于多个结果集中有重复数据的问题

    首先还是创建测试环境

    use tempdb
    
    create table tempTable1 (id int primary key identity, price int)
    create table tempTable2 (id int primary key identity, price int)
    insert into tempTable1 select 3 union all select 1 union all select 2 union all select 3 
    insert into tempTable2 select 3 union all select 4 union all select 1 union all select 2
    
    select * from temptable1
    select * from temptable2

    两个表的初始结果如下

    非常简单的两个表,列数和列顺序一样. 只要保证有数据完全一致,就可以说他们是重复的数据, 这样用上面3个运算词才会有效.

    先来看看UNION和UNION ALL

    select * from temptable1
    union
    select * from temptable2
    
    select * from temptable1
    union all
    select * from temptable2

    有 ALL 关键字是完全整合两个结果集,而无 ALL 是在之前的基础上去重了,所以第一个查询中{id:1, price:3}只会显示一条,结果如下:

    在来看看EXCEPT, 也是去重的, 但是它在去掉两个或多个集合中重复数据的之后, 只会保留第一个结果集中的数据

    select * from temptable1
    except
    select * from temptable2

    其实也是查询表A, 看表A的数据在表B中是否存在, 如果存在, 则删掉

    而INTERSECT比较好理解, 就是查询两个结果集的并集, 利用上面的数据,查询到的结果只有一条, 就是{id:1, price:3}, 这里就不给出代码和结果图

    注意UNION是对合并后的整个结果集去重

    我们运行下面的语句

    SELECT *
    FROM
    (
        SELECT 1 AS ID,N'A' AS NAME
        UNION ALL
        SELECT 1 AS ID,N'A' AS NAME
        UNION ALL
        SELECT 1 AS ID,N'A' AS NAME
    ) AS T
    UNION
    SELECT *
    FROM
    (
        SELECT 1 AS ID,N'A' AS NAME
        UNION ALL
        SELECT 2 AS ID,N'B' AS NAME
    ) AS T

    结果如下:

    其效果相当于:

    SELECT DISTINCT *
    FROM
    (
        SELECT *
        FROM
        (
            SELECT 1 AS ID,N'A' AS NAME
            UNION ALL
            SELECT 1 AS ID,N'A' AS NAME
            UNION ALL
            SELECT 1 AS ID,N'A' AS NAME
        ) AS T
        UNION ALL
        SELECT *
        FROM
        (
            SELECT 1 AS ID,N'A' AS NAME
            UNION ALL
            SELECT 2 AS ID,N'B' AS NAME
        ) AS T
    ) AS Temp
  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/5154135.html
Copyright © 2020-2023  润新知