2013-07-11 32 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 & ");"