2012-10-15 120 views
0

我有这个查询在SQL服务器上正常工作,但不在Access中,我无法转换它。我一直听说JET缺少一些TSQL功能,我想复杂的联接就是其中之一。无法将SQL查询转换为Access

SELECT C.[Position], TT.[Description] as TrainingType, T.ProgramTitle, T.ProgramSubTitle, T.ProgramCode, ET.CompletedDate 
from HR_Curriculum C 
LEFT JOIN HR_Trainings T ON C.TrainingID = T.TrainingID 
LEFT JOIN HR_TrainingTypes TT ON T.TrainingTypeID = TT.TrainingTypeID 

LEFT JOIN HR_EmployeeTrainings ET ON C.TrainingID = ET.TrainingID 
           AND (ET.AvantiRecID IS NULL OR ET.AvantiRecID = '637') 
where (c.[Position] = 'Customer Service Representative' 
     OR C.[Position] = 'All Employees') 
order by [Position], Description, ProgramTitle 

我试图把多余的连接语句的WHERE子句中下跌,但由于某些原因,这不会产生记录的正确计数。

回答

1

检查您的表别名是否与'as'一起被删除。访问不像[tablename] [别名],而是尝试[tablename]作为[别名]。我知道复杂的左连接不应该是一个问题,但是如果Access返回一些连接错误,Access可能会阻塞别名工具。我也会尝试查询ET表上的限制,然后将它加入到更大的查询中。我注意到,试图对涉及左或右连接的记录施加限制通常不会产生正确的记录,因为Access会在连接后限制集合。

+0

而我也越来越'JOIN表达不所以我想也许我不能在连接中做任何过滤。 – MAW74656

+1

您应该可以进行过滤,但是您必须小心,因为Access会在加入之后应用过滤器,这可能会或可能不是您想要的。只是为了安全起见,我会为已过滤的信息创建查询,并在需要时加入这些查询。 – KFleschner

2

当你有一个以上的JOINms-access需要用括号来包装他们是这样的:

SELECT C.[Position], TT.[Description] as TrainingType, T.ProgramTitle, T.ProgramSubTitle, T.ProgramCode, ET.CompletedDate 
from (((HR_Curriculum C 
LEFT JOIN HR_Trainings T ON C.TrainingID = T.TrainingID) 
LEFT JOIN HR_TrainingTypes TT ON T.TrainingTypeID = TT.TrainingTypeID) 

LEFT JOIN HR_EmployeeTrainings ET ON C.TrainingID = ET.TrainingID 
           AND (ET.AvantiRecID IS NULL OR ET.AvantiRecID = '637')) 
where (c.[Position] = 'Customer Service Representative' 
     OR C.[Position] = 'All Employees') 
order by [Position], Description, ProgramTitle 

,或者你将有Missing Operator错误

+0

获取'JOIN表达式不支持',所以我认为你是正确的关于parens,但也许我不能过滤连接。 – MAW74656