2013-07-11 33 views
1

我正在敲我的头,试图弄清楚如何将T-SQL查询转换为MSAccess将执行的格式。我对MSAccess很新,所以这是我的周末。我试图让这个查询拉我想要的信息到MSACCESS:构建MSAccess SQL查询的麻烦

SELECT p.person_id, mem.profile_id, nick_name, last_name, p.postal_code,p.birth_date,p.gender, grade.selected_value 
    FROM dbo.core_profile_member AS mem 
    INNER JOIN dbo.core_person AS p ON mem.person_id = p.person_id 
    LEFT JOIN dbo.evnt_registrant_field AS grade ON mem.person_id = grade.person_id AND mem.profile_id = grade.profile_id AND [email protected] 
    WHERE mem.status_luid <> 316 AND mem.profile_id IN (@profiles) 

我一直争取这一点,和阅读各种帖子,试图找出如何得到它的工作。这是我到目前为止所提出的,但是当代码执行查询时会引发语法错误。这是我迄今为止不起作用的:

strSQL1 = 
    "SELECT p.person_id, mem.profile_id, nick_name, last_name, " & _ 
    " p.postal_code, p.birth_date, p.gender FROM (" & _ 
    " dbo_core_profile_member AS mem INNER JOIN dbo_core_person AS p ON mem.person_id = p.person_id " & _ 
    " LEFT JOIN (SELECT person_id, profile_id, selected_value FROM dbo_evnt_registrant_field " & _ 
    " WHERE custom_field_id = " & strGradeID & ") AS grade ON mem.person_id = grade.person_id " & _ 
    " AND mem.profile_id = grade.profile_id) " & _ 
    " WHERE mem.status_luid <> 316 AND mem.profile_id IN (" & strProfileIDs & ");" 

我知道变量正常工作。如果我调试,并且在创建字符串之后检查立即窗口,我实际上可以在MSSQL管理工作室中运行它,它工作正常。我确信我缺少SQL生成器不喜欢的一些微妙的MSAccess细微差别。

任何人有什么我需要解决什么?通过上面的代码,我得到了“查询表达式中的语法错误(缺少运算符)...”错误。

回答

1

访问需要在包含多个连接的FROM子句中使用括号,并且数据库引擎对其位置感到烦恼。

我的猜测是FROM子句可以工作。我用一个静态值27代替strGradeID

FROM 
    (dbo_core_profile_member AS mem 
    INNER JOIN dbo_core_person AS p 
    ON mem.person_id = p.person_id) 
    LEFT JOIN 
     (
      SELECT person_id, profile_id, selected_value 
      FROM dbo_evnt_registrant_field 
      WHERE custom_field_id = 27 
     ) AS grade 
    ON 
      mem.person_id = grade.person_id 
     AND mem.profile_id = grade.profile_id 

无论我得到了正确的,你应该尝试设置您的加入与访问查询设计一个新的查询,如果可能的话。设计者知道在哪里放置圆括号来保持数据库引擎的快乐。

一旦你有一个工作的查询设计器中,使用的是静态值strGradeID和值的strProfileIDs静态列表,修改你的VBA代码产生相同的SQL。

+0

你的代码片段似乎工作!谢谢!我也喜欢使用查询设计器的想法,但是我看不到如何通过一个值限制evnt_registrant_field表而不在where子句中进行操作。这将带走它是真正的“左”功能。我希望纳入空值,不限于该数据集。 – gmaness

+0

我想你说的子查询是使用查询设计器的障碍。在这种情况下,我首先在设计器的设计视图中'LEFT JOIN dbo_evnt_registrant_field AS grade',然后切换到SQL视图并用子查询'(SELECT ... FROM dbo_evnt_registrant_field WHERE ...)替换'dbo_evnt_registrant_field'' 。或者,您可以构建并保存子查询SQL作为单独的查询,然后在创建主查询时将该查询用作数据源。 – HansUp

0
strSQL1 = 
    "SELECT p.person_id, mem.profile_id, nick_name, last_name, " & _ 
    " p.postal_code, p.birth_date, p.gender FROM " & _ 
    " dbo_core_profile_member AS mem INNER JOIN dbo_core_person AS p ON mem.person_id = p.person_id " & _ 
    " LEFT JOIN (SELECT person_id, profile_id, selected_value FROM dbo_evnt_registrant_field " & _ 
    " WHERE custom_field_id = " & strGradeID & ") AS grade ON mem.person_id = grade.person_id " & _ 
    " AND mem.profile_id = grade.profile_id " & _ 
    " WHERE mem.status_luid <> 316 AND mem.profile_id IN (" & strProfileIDs & ");"