如何在 MS Access 中相交?

Posted

技术标签:

【中文标题】如何在 MS Access 中相交?【英文标题】:How to INTERSECT in MS Access? 【发布时间】:2014-03-12 09:47:07 【问题描述】:

不知何故,MS Access 似乎无法访问关键字 INTERSECT,我现在需要它来修复数据库中的一些数据错误。

我查看了一些较早的问题,并找到了一些尝试通过使用 select distinct [...] inner join [...] 构造来解决此问题的答案。

但是,这似乎对我没有帮助,因为语法不适用于我需要相交的表。

下面是关于我想用 INTERSECT 实现什么的简短说明:

我的桌子看起来像这样(简化):

一个 |乙

你好 |世界

世界 |你好

现在这些数据集是多余的,但不幸的是不能被约束捕获,因为它们并不完全相同,而是镜像。这就是为什么他们首先被插入......

我认为通常我可以使用

选择所有受影响的数据集
 SELECT A,B FROM tbl
 INTERSECT
 SELECT B,A from tbl

选择它们后,我可以删除它们并解决这个问题...有没有人知道如何使用 MS Access 实现这一点?

【问题讨论】:

还有另一个 SO 线程 [这里][1] [1]:***.com/questions/337158/… 可能会有所帮助 这就是我在我的 OP 中提到的那个。这似乎对我没有帮助,因为缺少按特定顺序选择表字段的选项(我需要以不同的字段顺序与同一个表相交。A、B 和 B、A) 你能解释一下语法不适用于表格是什么意思吗? 【参考方案1】:

用于名为 [MirrorTest] 的表中的测试数据

pk  A      B    
--  -----  -----
 1  foo    bar  
 2  hello  world
 3  hello  there
 4  world  hello
 5  bar    baz  
 6  bar    foo  

查询

    SELECT pk, A, B
    FROM MirrorTest
    WHERE A<=B
UNION ALL
    SELECT pk, B, A
    FROM MirrorTest
    WHERE A>B

将返回所有符合 A

pk  A      B    
--  -----  -----
 2  hello  world
 3  hello  there
 5  bar    baz  
 6  bar    foo  
 1  bar    foo  
 4  hello  world

将其包装在聚合查询中以查找要删除的候选对象,定义为存在重复项的较大 [pk] 值

SELECT Max(pk) AS pkToDelete
FROM
    (
        SELECT pk, A, B
        FROM MirrorTest
        WHERE A<=B
    UNION ALL
        SELECT pk, B, A
        FROM MirrorTest
        WHERE A>B
    ) AS u
GROUP BY A, B
HAVING COUNT(*) > 1

返回

pkToDelete
----------
         6
         4

所以你可以在 DELETE 查询的 WHERE 子句中使用它

DELETE FROM MirrorTest
WHERE pk IN
    (
        SELECT Max(pk) AS pkToDelete
        FROM
            (
                SELECT pk, A, B
                FROM MirrorTest
                WHERE A<=B
            UNION ALL
                SELECT pk, B, A
                FROM MirrorTest
                WHERE A>B
            ) AS u
        GROUP BY A, B
        HAVING COUNT(*) > 1
    )

【讨论】:

效果很好,非常感谢!也喜欢那个循序渐进的教程:)

以上是关于如何在 MS Access 中相交?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 中动态引用控件名称

如何在 ms-access 中使用 ISNULL 函数

ODBC 连接凭据如何存储在 MS Access 中? [关闭]

MS Access:如何在 Access Web App 中添加 15 天至今(数据类型)

如何在 MS ACCESS 2007 查询中使用 LIMIT

如何在 Compact Framework 中使用 MS Access 数据库?