sql
  • vba
  • ms-access
  • multivalue
  • 2017-02-28 62 views 0 likes 
    0

    我試圖找到最優化的方式來做到這一點的操作運行在SQL語句訪問,VBA:優化SQL查詢中VBA

    SQl = "UPDATE " _ 
    & "MainTable As T1 " _ 
    & "INNER JOIN TableOfLists As T2 " _ 
    & "ON (T2.SecondList = T1.MultiValuedList.value) " _ 
    & "Set [FOUND IN LISTS] = 'YES' " 
    DoCmd.RunSQL SQl 
    
    SQl = "UPDATE " _ 
    & "MainTable As T1 " _ 
    & "INNER JOIN TableOfLists As T2 " _ 
    & "ON (T2.FirstList = T1.MultiValuedList.value) " _ 
    & "Set [FOUND IN LISTS] = 'YES' " 
    DoCmd.RunSQL SQl 
    

    此代碼的工作,能夠可靠地改善,但我沒有無法找出如何。

    我到目前爲止已經試過,結果我得到了:

    1. Adding 2 INNER JOIN但我得到一個語法錯誤3075
    2. Adding 2 conditions separated by an OR in the INNER JOIN condition,但我得到一個錯誤3081:不能參加超過1表
    3. This was my previous solution using 2 SELECT statements但我 得到了推薦使用JOIN代替

    歡迎任何建議!

    +0

    你的意思是在((T2.SecondList = T1.MultiValuedList.value))或(T2.FirstList = T1.MultiValuedList.value)???? –

    +0

    是的,括號沒有任何區別 – Seb

    +0

    我的意思是「括號」的「括號」 – Seb

    回答

    3

    你在這裏。這是ANSI SQL方式的一種做法,因爲UPDATE中的連接不受支持。 (請參閱this blog entry瞭解更多詳細信息。)這就是爲什麼您在第一種方法中看到錯誤(使用兩個INNER JOIN,因爲Access/Jet在其UPDATE語法中爲您提供了一個特殊功能,但它不像vanilla SQL那樣完全開發是因爲Access/Jet對連接條件中條件的支持非常有限(例如,在Oracle或Postgres中你不會看到這一點),你的第二種方法(在連接條件中帶有OR)出錯了。第三種方法(有兩個選擇,但使用IN而不是EXISTS)是相同的,所以誰告訴你使用連接是不明智的:)。

    UPDATE MainTable SET [FOUND IN LISTS]='YES' 
    WHERE 
        EXISTS (SELECT 1 FROM TableOfLists WHERE FirstList=MainTable.[value]) 
        OR 
        EXISTS (SELECT 1 FROM TableOfLists WHERE SecondList=MainTable.[value]); 
    

    Example in Access

    +0

    非常感謝這個答案!正是我在找的東西:) – Seb

    相關問題