簡體   English   中英

使用子查詢時,運行時錯誤3078“找不到輸入表”

[英]Runtime error 3078 “Cannot find input table” when using subquery

我在通過DAO在VBA腳本中運行此(非常笨拙的)SQL查詢時遇到問題。 它一直給我運行時錯誤3078,說:“ Microsoft Jet數據庫引擎找不到輸入表或查詢'SELECT Hist2.DateM ... GROUP BY Hist2.DateM'”

當我在Access中運行查詢時,它可以按預期工作。 我是否缺少明顯的東西? 我從Excel調用SQL語句的方式是否可能引起此問題?

SELECT Hist.DateM, Sum(Hist.Oil) AS SumOfOil, Sum(Hist.Gas) AS SumOfGas, Sum(Hist.GasSold) AS SumOfGasSold, Sum(Hist.Water) AS SumOfWater, Sum(Hist.InjWater) AS SumOfInjWater, Sum(Hist.DspdWater) AS SumOfDspdWater, OilCount.OilCount AS PrdCount, InjCount.InjCount
FROM ((MoPrdData AS Hist INNER JOIN WellMaster AS Loc ON Hist.WellID = Loc.LocationID) 
LEFT OUTER JOIN (
    SELECT Hist2.DateM, Count(Hist2.Oil) AS OilCount 
    FROM MoPrdData Hist2 INNER JOIN WellMaster Loc2 ON Hist2.WellID = Loc2.LocationId 
    WHERE Loc2.LeaseID = "26.00726" AND Hist2.Oil <> 0
    GROUP BY Hist2.DateM ) AS OilCount ON Hist.DateM = OilCount.DateM) 
LEFT OUTER JOIN (
    SELECT Hist3.DateM, Count(Hist3.InjWater) AS InjCount
    FROM MoPrdData Hist3 INNER JOIN WellMaster Loc3 ON Hist3.WellID = Loc3.LocationId 
    WHERE Loc3.LeaseID = "26.00726" AND Hist3.InjWater <> 0
    GROUP BY Hist3.DateM )  AS InjCount ON Hist.DateM = InjCount.DateM
WHERE Loc.LeaseID="26.00726"
GROUP BY Hist.DateM, OilCount.OilCount, InjCount.InjCount;

編輯:可能應該包括我正在使用的VBA,因為這可能是問題所在。

Sub GrabLeaseData()
'Clear the data
Sheets("PDE").Range("D2:XFD1048576").Clear

'Create links to data sources
Dim PWO As DAO.Database
Set PWO = Workspaces(0).OpenDatabase("PrdAcct", dbDriverNoPrompt, True, "ODBC;DSN=PrdAcct;DATABASE=PrdAcct")

Dim strSQL As String
Dim LeaseID As String
LeaseID = "26.00726" 'TODO: Parameterize this 

'Grab data
Dim Data As DAO.Recordset
strSQL =    "SELECT Hist.DateM, Sum(Hist.Oil) AS SumOfOil, Sum(Hist.Gas) AS SumOfGas, Sum(Hist.GasSold) AS SumOfGasSold, Sum(Hist.Water) AS SumOfWater, Sum(Hist.InjWater) AS SumOfInjWater, Sum(Hist.DspdWater) AS SumOfDspdWater, OilCount.OilCount AS PrdCount, InjCount.InjCount" & _
            "FROM ((MoPrdData AS Hist INNER JOIN WellMaster AS Loc ON Hist.WellID = Loc.LocationID) " & _
            "LEFT OUTER JOIN ( " & _
                "SELECT Hist2.DateM, Count(Hist2.Oil) AS OilCount " & _
                "FROM MoPrdData Hist2 INNER JOIN WellMaster Loc2 ON Hist2.WellID = Loc2.LocationId " & _
                "WHERE Loc2.LeaseID = """ & LeaseID & """ AND Hist2.Oil <> 0 " & _
                "GROUP BY Hist2.DateM ) AS OilCount ON Hist.DateM = OilCount.DateM) " & _
            "LEFT OUTER JOIN ( " & _
                "SELECT Hist3.DateM, Count(Hist3.InjWater) AS InjCount " & _
                "FROM MoPrdData Hist3 INNER JOIN WellMaster Loc3 ON Hist3.WellID = Loc3.LocationId " & _
                "WHERE Loc3.LeaseID = """ & LeaseID & """ AND Hist3.InjWater <> 0 " & _
                "GROUP BY Hist3.DateM )  AS InjCount ON Hist.DateM = InjCount.DateM " & _
            "WHERE Loc.LeaseID= """ & LeaseID & """ " & _
            "GROUP BY Hist.DateM, OilCount.OilCount, InjCount.InjCount; "

Debug.Print strSQL
Set Data = PWO.OpenRecordset(strSQL)

'Process results 
End Sub

這是一個簡單的調試問題。

將查詢剪切並粘貼到SSMS中。 為@LeaseId創建一個變量。 聲明並設置變量。
一旦它在SSMS中工作,就對其進行修改以在VBA中工作。

我現在要告訴你,我確實看到了一些我不喜歡的括號。

另外,您可以將其變成存儲過程,並以LeaseId作為參數。 在VBA方面較少的SQL編碼,它將被編譯。

問題:

1-按OilCount.OCVar分組,方法是不在頂部列出。 為什么?

2-如果我了解您要執行的操作,則OilCount.OilCount AS PrdCount應為SUM(OilCount.OilCount)AS PrdCount。

分組時,該列必須是group by子句的一部分,或者必須是諸如sum,min,max等的某些聚合函數。

用戶類型 -通過在分組依據中使用OilCount進行修復。

試試這個,讓我知道你的表現。

-- Add sample lease number
DECLARE @LeaseID VARCHAR(12) = '12345678';

-- Try query
SELECT 
    Hist.DateM,
    OilCount.OilCount AS PrdCount,
    InjCount.InjCount,
    Sum(Hist.Oil) AS SumOfOil, 
    Sum(Hist.Gas) AS SumOfGas, 
    Sum(Hist.GasSold) AS SumOfGasSold, 
    Sum(Hist.Water) AS SumOfWater, 
    Sum(Hist.InjWater) AS SumOfInjWater, 
    Sum(Hist.DspdWater) AS SumOfDspdWater

FROM 
    MoPrdData AS Hist 

INNER JOIN 
    WellMaster AS Loc ON Hist.WellID = Loc.LocationID

LEFT OUTER JOIN 
    ( SELECT Hist2.DateM, Count(Hist2.Oil) AS OilCount 
      FROM MoPrdData Hist2 
      INNER JOIN WellMaster Loc2 ON Hist2.WellID = Loc2.LocationId 
      WHERE Loc2.LeaseID = @LeaseID AND Hist2.Oil <> 0 
      GROUP BY Hist2.DateM 
    ) AS OilCount ON Hist.DateM = OilCount.DateM


LEFT OUTER JOIN 
    ( SELECT Hist3.DateM, Count(Hist3.InjWater) AS InjCount 
      FROM MoPrdData Hist3 
      INNER JOIN WellMaster Loc3 ON Hist3.WellID = Loc3.LocationId
      WHERE Loc3.LeaseID = @LeaseID  AND Hist3.InjWater <> 0 
      GROUP BY Hist3.DateM 
    )  AS InjCount ON Hist.DateM = InjCount.DateM 

WHERE 
    Loc.LeaseID = @LeaseID 

GROUP BY 
    Hist.DateM, 
    OilCount.OilCount, 
    InjCount.InjCount

暫無
暫無

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

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