2011-06-15 141 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