[英]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.