MS Access SQL:将UNION ALL和LEFT JOIN组合在一起

时间:2010-12-20 22:09:17

标签: sql ms-access

我在MS Access中创建了一个查询来模拟FULL OUTER JOIN并将结果组合起来,如下所示:

SELECT NZ(estimates.employee_id, actuals.employee_id) AS employee_id
, NZ(estimates.a_date, actuals.a_date) AS a_date
, estimates.estimated_hours
, actuals.actual_hours
FROM (SELECT *
      FROM estimates
      LEFT JOIN actuals ON estimates.employee_id = actuals.employee_id
         AND estimates.a_date = actuals.a_date
      UNION ALL
      SELECT *
      FROM estimates
      RIGHT JOIN actuals ON estimates.employee_id = actuals.employee_id
         AND estimates.a_date = actuals.a_date
      WHERE estimates.employee_id IS NULL
         OR estimates.a_date IS NULL) AS qFullJoinEstimatesActuals

我已将此查询保存为对象(我们称之为qEstimatesAndActuals)。我的目标是将qEstimatesAndActuals与另一张桌子联系起来。如下所示:

SELECT *
FROM qJoinedTable
LEFT JOIN (SELECT *
           FROM labor_rates) AS rates
ON qJoinedTable.employee_id = rates.employee_id
   AND qJoinedTable.a_date BETWEEN rates.begin_date AND rates.end_date

MS Access接受语法并运行查询,但它忽略了结果集中明显的结果。想知道日期格式是否以某种方式丢失,我在begin_date和end_date周围放置了一个FORMAT来强制它们被解释为短日期。奇怪的是,这产生了不同的结果集,但它仍然省略了它不应该有的结果。

我想知道查询是否以不能LEFT JOIN UNION ALL的结果集的方式执行。有没有人对此有任何想法/想法?有没有更好的方法来实现最终目标?

3 个答案:

答案 0 :(得分:1)

我会尝试将查询的每个部分分解为自己的访问查询对象,例如

SELECT *
  FROM estimates
  LEFT JOIN actuals ON estimates.employee_id = actuals.employee_id
     AND estimates.a_date = actuals.a_date

将是qryOne

SELECT *
  FROM estimates
  RIGHT JOIN actuals ON estimates.employee_id = actuals.employee_id
     AND estimates.a_date = actuals.a_date
  WHERE estimates.employee_id IS NULL
     OR estimates.a_date IS NULL

将是qryTwo

SELECT * FROM qryOne
UNION ALL
SELECT * FROM qryTwo

将qryFullJoinEstimatesActuals,最后

SELECT NZ(estimates.employee_id, actuals.employee_id) AS employee_id
, NZ(estimates.a_date, actuals.a_date) AS a_date
, estimates.estimated_hours
, actuals.actual_hours
FROM qryFullJoinEstimatesActuals

我发现在复杂的Access SQL语句中不起作用的构造通常可以正常工作,如果它们被分解为单个查询对象并逐步重新组装。此外,您可以单独测试查询的每个部分。如果证明有必要,这将帮助您找到解决方法。

答案 1 :(得分:0)

您可以准确找到如何执行此操作here

你错过了INNER JOIN .... UNION ALL step。

答案 2 :(得分:0)

与日期周围的奇怪行为相一致,这个问题与使用NZ从qFullJoinEstimatesActuals中选择日期有关。使用新西兰似乎使数据类型模糊不清。因此,我的帖子中的示例中的以下行导致错误:

, NZ(estimates.a_date, actuals.a_date) AS a_date

a_date的模糊数据类型导致BETWEEN运算符在将LE_JIN中的a_date与rates.begin_date和rates.end_date进行比较时产生错误结果。通过类型转换NZ函数的结果来解决该问题,如下所示:

, CDate(NZ(estimates.a_date, actuals.a_date)) AS a_date