奇怪的 MS 访问联盟问题:联盟实际上不是工会



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

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

      参数铁(铁)铁(铁)溶解铁(铁)-总计

该表TBL_ParentParameter如下所示:

      亲子铁(铁) 铁(铁)溶解铁 (铁) 铁 (铁)-总计

然后,我想创建一个查询,将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

这具有以下预期结果:

亲子铁(铁) 铁(铁)铁(铁) 铁(铁)溶解铁 (铁) 铁 (铁)-总计

但相反,给出:

亲子铁(铁) 铁(铁)铁(铁)溶解铁(铁)溶解铁(铁)溶解铁(铁)-总铁(铁)-总铁

现在,联合查询中的每个查询单独工作得很好,但是当联合查询时,它们不能正常工作。我已经尝试了与直接向 SQL 服务器传递查询完全相同的查询,它工作得很好,但是如果我基于此查询进行其他查询,我发现运行可能需要更长的时间。那么有谁知道这里的问题是什么?这是某种 MS 访问错误吗?还是我看错了?

已解决:这似乎是MS Access的错误,颠倒两个联合子查询的顺序解决了这个问题。

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

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

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

虽然反转 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

最新更新