【问题标题】:How can I implement SQL INTERSECT and MINUS operations in MS Access如何在 MS Access 中实现 SQL INTERSECT 和 MINUS 操作
【发布时间】:2010-09-25 03:05:14
【问题描述】:

我已经研究并没有找到在 MS Access 中运行 INTERSECT 和 MINUS 操作的方法。有没有办法存在

【问题讨论】:

    标签: sql database ms-access


    【解决方案1】:

    它们是通过 JOIN 完成的。老式的方式:)

    对于 INTERSECT,您可以使用 INNER JOIN。很简单。如果您没有纯粹的一对一关系,只需使用 GROUP BY 或 DISTINCT。否则,正如其他人所提到的,您可以获得比预期更多的结果。

    对于 MINUS,您可以使用 LEFT JOIN 并使用 WHERE 对其进行限制,因此您只能从主表中获取与 LEFT JOIN 表不匹配的行。

    简单易懂。

    【讨论】:

      【解决方案2】:

      INTERSECT 是一个内连接。 MINUS 是一个外连接,在这里您只选择另一个表中不存在的记录。


      相交
      select distinct
        a.*
      from
        a
        inner join b on a.id = b.id
      

      减号

      select distinct
        a.*
      from
        a
        left outer join b on a.id = b.id
      where
        b.id is null
      

      如果您编辑原始问题并发布一些示例数据,则可以给出示例。

      编辑:忘记在查询中添加 distinct。

      【讨论】:

      • 为什么会这样?该逻辑产生与 SQL 标准 INTERSECT 和 MINUS 相同的结果。
      • 这正是我所说的,但我被否决了。呃,好吧。为您 +1,因为您花时间实际提供语法示例。
      • 我没有重新定义任何标准。 MS Access 不使用该标准。
      • 但这仍然只有在“ID”是候选键表a时才能正常工作。
      • 无论如何,戴夫,你需要有一些东西可以比较。你能详细说明一下吗?
      【解决方案3】:

      不幸的是,MS Access 不支持 MINUS - 一种解决方法是创建三个查询,一个包含完整数据集,一个提取要过滤掉的行,第三个离开连接两个表并且只提取仅存在于您的完整数据集中的记录。

      对于 INTERSECT 也是如此,只是您将通过内部联接进行,并且只返回两者中都存在的记录。

      【讨论】:

      • 你的 MINUS 实现太复杂了。 -1
      • 不是 Access 不支持。如果您使用 MINUS 或 INTERSECT 编写到 SQL Server 的直通,它将正常工作。是Jet 数据库引擎,其SQL 方言没有这两个运算符。所有 SQL 方言都是不完整的,所以这对 Jet 来说不是什么大问题。
      【解决方案4】:

      INTERSECT 不是 INNER JOIN。他们是不同的。在没有 INTERSECT 的情况下,INNER JOIN 将为您提供重复的行。您可以通过以下方式获得等效结果:

      SELECT DISTINCT a.*
      FROM a
      INNER JOIN b
         on a.PK = b.PK
      

      请注意,PK 必须是主键列。如果桌子上没有PK(糟糕!),你必须这样写:

      SELECT DISTINCT a.*
      FROM a
      INNER JOIN b
         ON  a.Col1 = b.Col1
         AND a.Col2 = b.Col2
         AND a.Col3 = b.Col3 ...
      

      使用 MINUS,您可以做同样的事情,但使用 LEFT JOIN 和 WHERE 条件检查表 b 的一个不可为空的列(最好是主键)是否为空。

      SELECT DISTINCT a.*
      FROM a
      LEFT JOIN b
         on a.PK = b.PK
      WHERE b.PK IS NULL
      

      应该这样做。

      【讨论】:

      • 干杯,忘了在我的帖子中添加不同的内容。 +1。
      【解决方案5】:

      我相信这个是减号

      SELECT DISTINCT
        a.CustomerID, 
        b.CustomerID
      FROM 
        tblCustomers a
      LEFT JOIN 
        [Copy Of tblCustomers] b
      ON
        a.CustomerID = b.CustomerID
      WHERE
        b.CustomerID IS NULL
      

      【讨论】:

      • 这个答案与其他答案有何不同?
      • 实际上,我尝试了其他答案,我觉得有必要分享它的工作原理。
      • 那么你就可以等着点赞,以后再点赞
      【解决方案6】:

      Access 中没有 MINUS,但您可以使用子查询。

      SELECT DISTINCT a.*
      FROM a
      WHERE a.PK NOT IN (SELECT DISTINCT b.pk FROM b)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-26
        • 1970-01-01
        • 1970-01-01
        • 2014-10-14
        • 1970-01-01
        相关资源
        最近更新 更多