如何在MS Access中实现SQL INTERSECT和MINUS操作

时间:2008-12-03 13:54:05

标签: sql database ms-access

我已经研究过并且没有找到在MS Access中运行INTERSECT和MINUS操作的方法。有没有办法

5 个答案:

答案 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