MS Access似乎无法访问关键字INTERSECT,我现在需要它来修复数据库中的一些数据错误。
我查看了一些较旧的问题,并找到了一些试图通过使用选择不同的[...]内部联接[...]结构来解决此问题的答案。
然而,这似乎对我没有帮助,因为语法不适用于我需要交叉的表。
以下是关于我想通过INTERSECT实现目标的简短说明:
我的表看起来像这样(简化):
A |乙
你好|世界
世界|喂
现在这些数据集是冗余的,但遗憾的是不能被约束捕获,因为它们不完全相同,而是镜像的。这就是他们首先插入的原因......
我认为通常我可以使用
选择所有受影响的数据集 SELECT A,B FROM tbl
INTERSECT
SELECT B,A from tbl
选择它们之后我可以删除它们并解决这个问题......有没有人知道如何使用MS Access实现这一点?
答案 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
)