2011-06-15 140 views
0

我喜欢将此查询转换为Access 2007. 每次尝试运行它时,都会在查询表达式中收到语法错误缺失操作符。将TSQL查询转换为访问

我感谢所有帮助

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 
+0

我记得,Access是'RIGHT JOIN'的粉丝。您是否将Access连接到SQL Server?如果是这样,为什么不使用设计师... – 2011-06-15 16:10:03

+0

我不确定如何在设计器中重新创建它,因为代码似乎是硬编码的。 – 2011-06-15 16:30:25

回答

0

一些 “问题” 我看到了蝙蝠的权利:

  1. 访问SQL不支持CASE。由于您的CASE声明均为双值,因此请使用Iif(<condition>, <true_part>, <false_part>)
  2. 访问是非常挑剔有关在圆括号中引入多个连接。工作“最后到第一个”,捕获最后一组加入(这两个表名称 - 在这种情况下,您的子选择是其中之一 - 与ON字段之间的联接),然后另一个结束之后,在前面加入的表名之前打开,& c。直到你拥有所有除了第一个表名(并且第一个JOIN)封闭在parens。 (不要被愚弄 - 但不是实际上强制执行评估顺序)。
  3. 我认为Access想要LEFT JOIN而不是LEFT OUTER JOIN,但这可能没有关系。
  4. 访问可能不支持“force to Unicode”N'string'运算符。我从来没有使用过它,但实际上并不会发誓它是错误的(在上下文中)。
  5. 访问首选双引号来引起字符串,而不是单个引号。它通常接受单引号,但。

这可能无法解决您的问题,但它可能会让您朝着正确的方向前进。

+0

访问确实支持'LEFT OUTER JOIN'。 – onedaywhen 2011-06-15 18:53:56

+1

访问IGNORES'LEFT OUTER JOIN'并将其视为与'LEFT JOIN'完全相同。在QBE中尝试它 - 你可以写一个JOIN,它会运行良好。但保存并重新打开它,“OUTER”这个词现在消失了。 – 2011-06-15 22:10:58

+0

这正是我的想法 - 为什么我说这可能无关紧要。 – RolandTumble 2011-06-16 17:59:58