【发布时间】:2010-09-25 03:05:14
【问题描述】:
我已经研究并没有找到在 MS Access 中运行 INTERSECT 和 MINUS 操作的方法。有没有办法存在
【问题讨论】:
我已经研究并没有找到在 MS Access 中运行 INTERSECT 和 MINUS 操作的方法。有没有办法存在
【问题讨论】:
它们是通过 JOIN 完成的。老式的方式:)
对于 INTERSECT,您可以使用 INNER JOIN。很简单。如果您没有纯粹的一对一关系,只需使用 GROUP BY 或 DISTINCT。否则,正如其他人所提到的,您可以获得比预期更多的结果。
对于 MINUS,您可以使用 LEFT JOIN 并使用 WHERE 对其进行限制,因此您只能从主表中获取与 LEFT JOIN 表不匹配的行。
简单易懂。
【讨论】:
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。
【讨论】:
不幸的是,MS Access 不支持 MINUS - 一种解决方法是创建三个查询,一个包含完整数据集,一个提取要过滤掉的行,第三个离开连接两个表并且只提取仅存在于您的完整数据集中的记录。
对于 INTERSECT 也是如此,只是您将通过内部联接进行,并且只返回两者中都存在的记录。
【讨论】:
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
应该这样做。
【讨论】:
我相信这个是减号
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
【讨论】:
Access 中没有 MINUS,但您可以使用子查询。
SELECT DISTINCT a.*
FROM a
WHERE a.PK NOT IN (SELECT DISTINCT b.pk FROM b)
【讨论】: