2014-03-12 42 views
1

不知何故,MS Access似乎无法访问INTERSECT关键字,我现在需要它来修复数据库中的一些数据错误。如何在MS Access中交互?

我在老问题上看了一下,发现一些答案试图通过使用选择明确的内部连接构造来解决这个问题。

但是,这似乎没有帮助我,因为语法不适用于我需要相交的表。

这里有我想要实现与交叉的简短解释:

我的表看起来像这样(简化):

A | B

hello |世界

世界|你好

现在这些数据集是多余的,但不幸的是不能被约束捕获,因为它们不完全相同,而是被镜像。这就是为什么他们得到了摆在首位插入...

我觉得平时我将能够通过使用

SELECT A,B FROM tbl 
INTERSECT 
SELECT B,A from tbl 

选择所有受影响的数据集在选择他们,我可能只是将其删除后将摆脱这个问题......有没有人有一个想法如何使用MS Access实现这一点?

+0

还有另外一个SO线程[这里] [1] [1]:http://stackoverflow.com/questions/337158/how-can-i-implement-sq l-intersect-and-minus-operations-in-ms-access 这可能有帮助 – babak

+0

这就是我在OP中提到的那个。这似乎对我没有帮助,因为缺少按特定顺序选择表格字段的选项(我需要以相同的表格相交,但以不同的字段顺序排列,A,B和B,A) – daZza

+0

您能解释一下你的意思是_语法不适用于table_? – Nybbe

回答

4

对于命名[镜子测试]

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 < = 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 

所以你也可以使用删除查询的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 
    ) 
+0

很好,非常感谢!也喜欢这个一步一步的教程:) – daZza