如何在 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 中相交?的主要内容,如果未能解决你的问题,请参考以下文章
ODBC 连接凭据如何存储在 MS Access 中? [关闭]
MS Access:如何在 Access Web App 中添加 15 天至今(数据类型)