2017-06-22 60 views
0

MS访问SQL错误我试图做一个设置的差异,如this问题所示,除了我在Microsoft Access中执行它。我使用的SQL查询如下:从条款

SELECT FieldName 
FROM CalParams_External 
EXCEPT SELECT FieldName 
FROM CalParams_Internal 
UNION 
SELECT FieldName 
FROM CalParams_Internal 
EXCEPT SELECT FieldName 
FROM CalParams_External 

当我运行这个然而,它抛出一个错误:

Syntax error in FROM clause

我希望得到这个工作。我在这里做错了什么,以及如何让这个简单的脚本运行?

编辑

根据下面的评论,JET不支持EXCEPT声明。我想通过使用MINUS语句(我相信这是支持的)找到只有一个数据集的非相交部分来分解问题。下面是我现在在做什么:

SELECT FieldName 
From CalParams_External 
MINUS 
SELECT FieldName 
FROM CalParams_Internal 

我仍然得到尽管关于FROM条款相同的错误。

+0

JET不支持EXCEPT。 –

+0

那么我怎么能在JET上做到这一点? – user32882

+0

看到https://stackoverflow.com/questions/19615177/how-do-i-write-a-full-outer-join-query-in-access – koriander

回答

3

由于MS Access不支持EXCEPT,请改为使用NOT INNOT EXISTSNOT IN更具可读性,但仅适用于非空列。

NOT IN查询:

SELECT FieldName FROM CalParams_External 
WHERE FieldName NOT IN (SELECT FieldName FROM CalParams_Internal) 
UNION 
SELECT FieldName FROM CalParams_Internal 
WHERE FieldName NOT IN (SELECT FieldName FROM CalParams_External); 

NOT EXISTS查询:

SELECT FieldName FROM CalParams_External e 
WHERE NOT EXISTS (SELECT * FROM CalParams_Internal i WHERE i.FieldName = e.FieldName) 
UNION 
SELECT FieldName FROM CalParams_Internal i 
WHERE NOT EXISTS (SELECT * FROM CalParams_External e WHERE e.FieldName = i.FieldName) 

聚集查询:

另一种方法是选择每个FiedName一次从各表,然后选择那些只发生在其中之一:

SELECT FieldName 
FROM 
(
    SELECT DISTINCT FieldName FROM CalParams_External 
    UNION ALL 
    SELECT DISTINCT FieldName FROM CalParams_Internal 
) 
GROUP BY FieldName 
HAVING COUNT(*) = 1; 
+0

它似乎工作,但我想看看,如果'MINUS '语句可以在这种情况下使用。你可以为“MINUS”查询添加一个选项吗? – user32882

+0

MS Access不支持'EXCEPT'这是标准的SQL,也不是Oracle专有的'MINUS'。我已经为我的答案添加了一个替代方案,但是在MS Access中没有像“EXCEPT”这样的内容。 –

+0

好的,我会接受答案 – user32882