如何在MS Access中进行交互?

时间:2014-03-12 09:47:07

标签: sql vba ms-access

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

我查看了一些较旧的问题,并找到了一些试图通过使用选择不同的[...]内部联接[...]结构来解决此问题的答案。

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

以下是关于我想通过INTERSECT实现目标的简短说明:

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

A |乙

你好|世界

世界|喂

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

我认为通常我可以使用

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

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

1 个答案:

答案 0 :(得分:4)

对于名为[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&lt; = B,即

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
    )