我在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的结果集的方式执行。有没有人对此有任何想法/想法?有没有更好的方法来实现最终目标?
答案 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