奇怪的MS Access Union问题:Union实际上并不是联盟

时间:2012-08-08 17:54:24

标签: sql ms-access union

将MS Access与SQL Server后端一起使用,我有一个表基本上存储来自另一个表的参数字段的分组。

例如,我将参数存储在TBL_Parameter中:(只是数据的一小部分)

Parameter
Iron (Fe)
Iron (Fe)-Dissolved
Iron (Fe)-Total

表格,TBL_ParentParameter如下所示:

Parent        Child
Iron (Fe)     Iron (Fe)-Dissolved
Iron (Fe)     Iron (Fe)-Total

然后我想创建一个查询,将未包含在TBL_ParentParameter中的子项的所有参数与TBL_ParentParameter中包含的所有参数组合在一起,因此我进行了以下联合查询:

SELECT Parameter, Parameter AS Child
FROM TBL_Parameter
WHERE Parameter NOT IN(SELECT Child FROM TBL_ParentParameter)
UNION
SELECT Parent AS Parameter, Child
FROM TBL_ParentParameter

这有以下预期结果:

Parent        Child
Iron (Fe)     Iron (Fe)
Iron (Fe)     Iron (Fe)-Dissolved
Iron (Fe)     Iron (Fe)-Total

但反而给出:

Parent               Child
Iron (Fe)            Iron (Fe)
Iron (Fe)-Dissolved  Iron (Fe)-Dissolved
Iron (Fe)-Total      Iron (Fe)-Total

现在联合查询中的每个查询都可以单独完成,但在联合时,它们无法正常工作。我已经尝试了这个完全相同的查询作为直通查询直接到SQL服务器,这工作得很好,但如果我基于此查询的其他查询,我发现它可能需要花费几倍的时间来运行。那么有谁知道这里的问题是什么?这是某种MS Access错误吗?或者我看错了吗?

已解决:似乎这是MS Access的一个错误,并且反转两个联合子查询的顺序解决了这个问题。

3 个答案:

答案 0 :(得分:2)

您的查询是正确的。我跑了它,我得到了你发布的倒数第二代码。

答案 1 :(得分:2)

这似乎是MS Access的一个错误,并且反转两个联合子查询的顺序解决了这个问题。

答案 2 :(得分:1)

我猜这与你在第一个查询中将Parameter字段别名为Child有关。然后,当您在第二个查询中引用Child时,Access假定您要在第一个查询中使用Child的别名定义(即Parameter字段)。

虽然撤消UNION中查询的顺序可能会解决您的问题,但如果Parent有多个可能值,则Parent字段可能会遇到问题。

更好的解决方案是完全限定您的字段名称(或者只使用与现有字段不冲突的别名):

SELECT P.Parameter, P.Parameter AS Child
FROM TBL_Parameter AS P
WHERE P.Parameter NOT IN (SELECT SubPP.Child FROM TBL_ParentParameter AS SubPP)
UNION
SELECT PP.Parent AS Parameter, PP.Child
FROM TBL_ParentParameter AS PP