将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的一个错误,并且反转两个联合子查询的顺序解决了这个问题。
答案 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