我已经研究过并且没有找到在MS Access中运行INTERSECT和MINUS操作的方法。有没有办法
答案 0 :(得分:30)
INTERSECT是一个内部联接。 MINUS是一个外连接,您只能选择另一个表中不存在的记录。
<小时/> INTERSECT
select distinct
a.*
from
a
inner join b on a.id = b.id
MINUS
select distinct
a.*
from
a
left outer join b on a.id = b.id
where
b.id is null
如果您编辑原始问题并发布一些示例数据,则可以给出一个示例。
编辑:忘记在查询中添加不同的内容。
答案 1 :(得分:14)
INTERSECT不是内部联系。他们是不同的。如果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的不可为空的列(最好是主键)之一上检查null。
SELECT DISTINCT a.*
FROM a
LEFT JOIN b
on a.PK = b.PK
WHERE b.PK IS NULL
应该这样做。
答案 2 :(得分:3)
他们是通过JOIN完成的。老式的方式:)
对于INTERSECT,您可以使用INNER JOIN。非常直截了当。如果你没有一个纯粹的一对一关系,只需要使用GROUP BY或DISTINCT。否则,正如其他人所提到的那样,你可以获得比预期更多的结果。
对于MINUS,您可以使用LEFT JOIN并使用WHERE来限制它,这样您只能从主表中获取与LEFT JOINed表不匹配的行。
轻松自负。
答案 3 :(得分:0)
不幸的是,MS Access不支持MINUS - 一种解决方法是创建三个查询,一个包含完整数据集,一个用于提取要过滤的行,另一个用于连接两个表并且只提取仅存在于完整数据集中的记录。
INTERSECT也是如此,除非您通过内部联接进行,只返回两者中存在的记录。
答案 4 :(得分:-1)
我相信这是减号
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