簡體   English   中英

Excel VBA SQL連接語法錯誤

[英]Excel VBA SQL Join Syntax Error

我正在寫一個允許用戶從列表框中選擇客戶的子程序。 選擇記錄為CustomerID(整數變量),並用於查詢Access數據庫文件。 然后,該子項應將有關指定客戶的銷售信息輸出到excel工作表中,特別是:

  1. 訂購日期
  2. 訂單ID
  3. 總訂單成本(定義為已售數量*已售價格)

訪問文件具有我需要的3個表:客戶,訂單,訂單項

我下面的代碼應將客戶ID與訂單ID字段結合在一起,然后將其與訂單ID結合在一起,並將訂單ID與訂單項結合起來。

' Define SQL statement to get order info for selected product.
SQL = "SELECT O.OrderDate, COUNT(O.OrderID), SUM(L.QuantityOrdered * L.QuotedPrice) AS [TotalCost] " _
        & "FROM (((Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID) " _
        & "INNER JOIN ON O.OrderID = O.CustomerID) INNER JOIN LineItems L " _
        & "ON O.OrderID = L.OrderID)" _
        & "WHERE O.CustomerID =" & CustomerID & " " _
        & "GROUP BY O.OrderDate, O.OrderID" _
        & "ORDER BY O.OrderDate"

我不斷收到“ FROM子句中的語法錯誤”。 我的JOIN語句正確嗎? 我玩過(),“”等,但沒有成功。 我已經檢查過,並且表名正確(訂單,客戶,訂單項)字段名稱也拼寫正確。

我喜歡使用帶有空格分隔符的數組和Join方法。 這樣可以確保我不會錯過任何空格(@ McAdam133指出您確實有空格)。

Dim aSql(1 To 6) As String

aSql(1) = "SELECT O.OrderDate, COUNT(O.OrderID), SUM([L.QuantityOrdered]*[L.QuotedPrice]) AS TotalCost"
aSql(2) = "FROM (Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID)"
aSql(3) = "INNER JOIN LineItems L ON O.OrderID = L.OrderID"
aSql(4) = "WHERE C.CustomerID = " & CustomerID
aSql(5) = "GROUP BY O.OrderDate"
aSql(6) = "ORDER BY O.OrderDate"

Set rs = CurrentProject.Connection.Execute(Join(aSql, Space(1)))

這是我對不起作用的內部聯接的建議。 在Access中創建一個查詢,並查看它生成的SQL。 它可能不是最漂亮的SQL,但可以幫助您確定問題所在。 如果將“客戶”,“訂單”和“訂單項”放置在查詢窗口中,則在必要時繪制箭頭(默認情況下可能會出現在其中),然后在其中放置幾個​​字段,Access會生成類似

SELECT Orders.OrderID, Orders.OrderDate, LineItems.QuantityOrdered, LineItems.QuotedPrice
FROM (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) INNER JOIN LineItems ON Orders.OrderID = LineItems.OrderID;

這不會對任何內容進行分組或使用別名,但可以為您提供有效的說明。 然后,您可以使用別名和分組進行修改,並進行測試。

從您的示例:

& "FROM (((Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID) " _

這條線很好。 您要使用客戶的主鍵(可能是訂單中的外鍵)加入訂單中的客戶。

& "INNER JOIN ON O.OrderID = O.CustomerID) INNER JOIN LineItems as L " _

我不確定第一個聯接要完成什么,但是正如@OpiesDad所說,這不是您想要的。 您已經在第一行中成功加入了Customers和Orders,因此您可以獲取該聯接的結果並將其聯接到LineItems(上面的aSql(3))。 第二個聯接(到LineItems)看起來不錯。

您可以在一個以上的字段上連接兩個表。 就像您有兩個客戶表,並且想查看是否有任何重疊。

FROM Wholesale INNER JOIN Retail ON Wholesale.CustomerName = Retail.CustName AND Wholesale.State = Retail.StateOrProvince

根據所顯示的結構,您在所有表中都有非常獨特的主鍵,因此不必在多個字段上進行聯接。

最后,您要在OrderID上分組。 它不會引起錯誤,但也不會做任何事情。 您可以在SELECT部分​​的聚合函數中使用OrderID。 您應該匯總要匯總的字段,並按不匯總的字段分組。

INNER JOIN的表中創建別名時,必須使用AS

' Define SQL statement to get order info for selected product.
SQL = "SELECT O.OrderDate, COUNT(O.OrderID), SUM(L.QuantityOrdered * L.QuotedPrice) AS [TotalCost] " _
        & "FROM (((Customers as C INNER JOIN Orders O ON C.CustomerID = O.CustomerID) " _
        & "INNER JOIN ON O.OrderID = O.CustomerID) INNER JOIN LineItems as L " _
        & "ON O.OrderID = L.OrderID)" _
        & "WHERE O.CustomerID =" & CustomerID & " " _
        & "GROUP BY O.OrderDate, O.OrderID" _
        & "ORDER BY O.OrderDate;"

當然,請使用;終止該語句;

您遇到的問題是您嘗試執行的聯接沒有意義。

我們首先獲取相關訂單,然后添加訂單項,因為這將使說明更加簡單。

為此,您需要SQL:

SELECT C.CustomerID, C.CustomerName, O.OrderID, O.OrderDate
FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID
WHERE C.CustomerID = 15
ORDER By O.OrderDate

請注意,這假設您要查找的客戶的ID為15。

這將為您提供所請求客戶的所有按升序排列的訂單列表。

如果需要訂單項,則還需要鏈接到此表:

 SELECT C.CustomerID, C.CustomerName, O.OrderId, O.OrderDate
     , SUM(L.QuantityOrdered * L.QuotedPrice) AS [TotalCost]
 FROM ((Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID)
              INNER JOIN LineItems L ON O.OrderID = L.OrderID)
 WHERE C.CustomerID = 15
 GROUP BY C.CustomerID, C.CustomerName, O.OrderID, O.OrderDate
 ORDER BY O.OrderDate

這可能是您要查找的查詢。 您列出的第二個INNER JOIN是多余的,沒有任何意義。 您不想將OrderID與CustomerID匹配,而是想要與該客戶匹配的訂單列表。 C到O上的第一個INNER JOIN已經創建了這個。 where子句將客戶表限制為一個客戶。

要將其放入代碼中,只需將表單中的“ 15”替換為“ CustomerID”即可。

此外,根據McAdam的評論,您在幾個地方缺少空格。 要解決此問題,我建議將所有空格放在行的開頭,以便確保它們在那里(如下所述)。 最終代碼應如下所示(從輸出中刪除客戶信息):

 SQL = "SELECT O.OrderDate, O.OrderID" _
    & ", SUM(L.QuantityOrdered * L.QuotedPrice) AS [TotalCost]" _
    & " FROM ((Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID)" _
    & " INNER JOIN LineItems L ON O.OrderID = L.OrderID)" _
    & " WHERE O.CustomerID =" & CustomerID _
    & " GROUP BY O.OrderDate, O.OrderID" _
    & " ORDER BY O.OrderDate"

您似乎也不實際想要orderID的數量,所以我將其刪除了,因為它也沒有太大意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM