将SQL查询转换为Access

时间:2011-06-15 15:47:45

标签: sql tsql ms-access-2007 left-join

我想将此查询转换为Access 2007。 每次我尝试运行它时,我在查询表达式中得到一个语法错误缺失运算符。

我感谢任何帮助

SELECT     
u.UserID, 
u.FirstName, 
u.LastName, 
u.Username, 
u.Email, 
u.DisplayName, 
upd.TypeOfAccess, 
upd.kusfCompanyCode FROM dbo.dnn_Users AS u INNER JOIN
dbo.dnn_UserRoles AS ur ON u.UserID = ur.UserID INNER JOIN
dbo.dnn_Roles AS r ON ur.RoleID = r.RoleID AND (r.RoleName = N'KUSF Agent' OR r.RoleName = N'KUSF Company With Agent' OR r.RoleName = N'KUSF Company Without Agent') LEFT OUTER JOIN
(SELECT     
    up.UserID, 
    MAX(CASE WHEN ppd.PropertyName = 'TypeOfAccess' THEN up.PropertyValue ELSE '' END) AS TypeOfAccess,
    MAX(CASE WHEN ppd.PropertyName = 'kusf CompanyCode' THEN up.PropertyValue ELSE '' END) AS kusfCompanyCode
FROM
    dbo.dnn_UserProfile AS up INNER JOIN
    dbo.dnn_ProfilePropertyDefinition AS ppd ON 
    up.PropertyDefinitionID = ppd.PropertyDefinitionID AND ppd.PortalID = 0 
GROUP BY up.UserID) as upd on u.UserID = upd.UserID

2 个答案:

答案 0 :(得分:0)

在将TSQL查询转换为Access 2007查询时,请查看此规则集,如帖子中所述。可能会有助于解决您的问题。

Convert Microsoft Access (JET SQL) to SQL Server (T-SQL) Cheatsheet

答案 1 :(得分:0)

我正在看到的一些“问题”:

  1. Access SQL不支持CASE。由于您的CASE语句都是双值的,因此请使用Iif(<condition>, <true_part>, <false_part>)
  2. 访问非常挑剔关于在括号中设置多个连接。工作“从头到尾”,捕获一组parens中的最后一个连接(两个表名 - 在这种情况下,您的子选择是其中之一 - 在ON字段之间的连接) ,然后是另一个关闭的paren,它在前面的连接的表名之前打开,&amp; c。除非第一个表名称(和第一个JOIN)包含在parens中,否则(不要被愚弄 - 这确实 实际上强制执行评估顺序。)
  3. 我认为Access需要LEFT JOIN而不是LEFT OUTER JOIN,但这可能并不重要。
  4. Access可能不支持“强制转换为Unicode”N'string'运算符。我从未使用它,但实际上不会发誓这是错误的(在上下文中)。
  5. Access更喜欢使用双引号来设置字符串,而不是单引号。但通常接受单引号。
  6. 这可能无法解决您的问题,但可能会让您朝着正确的方向前进。