3

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

例如,我将参数存储在 TBL_Parameter 中:(只是数据的一个非常小的子集)

范围
铁 (Fe)
铁 (Fe)-溶解
铁 (Fe)-总

表 TBL_ParentParameter 如下所示:

父子
铁 (Fe) 铁 (Fe)-溶解
铁 (Fe) 铁 (Fe)-总

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

这具有以下预期结果:

父子
铁 (Fe) 铁 (Fe)
铁 (Fe) 铁 (Fe)-溶解
铁 (Fe) 铁 (Fe)-总

而是给出:

父子
铁 (Fe) 铁 (Fe)
铁 (Fe)-溶解铁 (Fe)-溶解
铁 (Fe)-总铁 (Fe)-总

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

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

4

3 回答 3

2

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

于 2012-08-08T18:17:09.207 回答
2

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

于 2012-08-10T18:43:43.127 回答
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
于 2012-08-08T19:24:36.547 回答