2014-03-12 38 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