【问题标题】:TSQL INTERSECT KeywordTSQL INTERSECT 关键字
【发布时间】:2011-01-09 22:03:55
【问题描述】:

我已经知道 SQL Server 2005/2008 关键字 EXCEPTINTERSECT 有一段时间了,但从来没有找到一个令人信服的理由来使用 INTERSECT 而不是旧的 UNION 关键字。

谁能解释一下您何时或为何使用INTERSECT 而不是UNION

【问题讨论】:

    标签: sql-server-2005 tsql sql-server-2008 join


    【解决方案1】:

    他们做不同的事情。

    来自 MSDN:

    EXCEPT 返回左侧查询中未在右侧查询中找到的任何不同值。

    INTERSECT 返回由 INTERSECT 操作数左右两侧的查询返回的任何不同值。

    UNION 将两个或多个查询的结果组合成一个结果集,其中包括属于联合中所有查询的所有行。

    【讨论】:

    • 噢!我觉得自己像个彻头彻尾的白痴,当然有区别......也许我应该更仔细地阅读MSDN。谢谢
    • 在考虑这些时,我通常只是想象一个维恩图 :)
    【解决方案2】:

    INTERSECT 返回在两个记录集中找到的记录

    UNION 返回在任何个记录集中找到的记录。

    EXCEPT 返回在第一个记录集中找到但不在第二个记录集中的记录。

    由于INTERSECTEXCEPT 都只能返回在第一个记录集中找到的记录,因此可以使用连接或IN / NOT IN 谓词重写它们。

    但是,它们有时更方便,因为 SQL Server 不支持多列上的 IN 表达式。

    INTERSECTEXCEPTJOININ 不同,将 NULL 值视为匹配。这个查询:

    SELECT  NULL
    INTERSECT
    SELECT  NULL
    

    返回一条记录,而这条:

    SELECT  NULL
    WHERE   NULL IN
            (
            SELECT  NULL
            )
    

    什么都不返回。

    【讨论】:

    • 是的,不知什么原因我直到现在才明白……真丢人。
    【解决方案3】:

    INTERSECT 通常可以被 INNER JOINS 替换,所以这可能是您觉得它们没用的原因。

    不过,EXCEPT 是一个非常有趣的功能。 例如考虑一个简单的标记系统: 例如,您使用“徽章”标记每个用户,并且您希望找到所有没有“评论”徽章的用户。您可以使用 EXCEPT 功能轻松做到这一点。 (虽然:这也可以表示为 LEFT JOIN .. WHERE left_site IS NULL)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 2011-11-01
      • 1970-01-01
      • 2011-08-20
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多