我已经创建在MS Access查询来模拟FULL OUTER JOIN和合并,看起来像下面这样的结果:MS访问SQL:麻烦UNION将所有与LEFT 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,以强制它们被解释为Short Dates。奇怪的是,这产生了不同的结果集,但它仍然省略了它不应该有的结果。
我想知道如果查询是以这样的方式执行,你不能左加入一个UNION ALL的结果集。有没有人对此有过任何想法/想法?有没有更好的方式来实现最终目标?
我也对Nz()的返回类型的不可靠性感到沮丧,但是根据定义,你期望其中的一个参数至少有一些时间是空的,这意味着函数需要在返回类型或检查有关源数据的元数据。所以,你必须自己做。也就是说,Nz()表达式的连接会让我感到困难,因为它不能使用索引。 – 2010-12-21 02:32:01
这篇文章基于向UNION ALLs展示,这很合理。你只有一个。你怎么能得到所有的结果? – IamIC 2010-12-21 04:31:35
@ David-W-Fenton这当然是有道理的。至于设计上的问题,你有另外一个建议吗?通过略微简化,有两个表格:(1)包含employee_id,week_end_date和projected_hours的估计表,以及(2)具有employee_id,week_end_date和actual_hours的实际表。可能有员工预计会工作,但不会。同样,可能有员工没有投入工作,但是这样做。目标:将employee_id,week_end_date,projected_hours,actual_hours获取到单个可查询对象中。例如,001,9/26/2010,0,10 – Adam 2010-12-21 16:39:05