我有这个应该在MS Access中使用的查询,但数据库是一个SQL数据库。当我在SQL环境中运行此查询时,它完美地工作。但是,在MS Access中运行时,我会收到错误。我对SQL的了解很少(来自MySQL),更不用说MS Access了。
该查询应该为我提供某个投标人类型中对某个项目进行投标的总人数(无论他们是否赢了),该投标人类型中赢得的项目的总价格以及投标人类型,所有的一次拍卖。以下是查询。
SELECT Total.count, SUM(dbo_tblItem.item_premium + dbo_tblItem.item_pr) AS SumTotal, dbo_tblBidder.bidder_type
FROM dbo_tblBidder LEFT OUTER JOIN
dbo_tblItem ON dbo_tblItem.item_bidder_number = dbo_tblBidder.bidder_number AND
dbo_tblItem.item_sale_id = dbo_tblBidder.bidder_sale_id LEFT OUTER JOIN
(SELECT COUNT(bidder_type) AS count, bidder_type
FROM dbo_tblBidder AS tblBidder_1
WHERE (bidder_sale_id = 235)
GROUP BY bidder_type) AS Total ON dbo_tblBidder.bidder_type = Total.bidder_type
WHERE (dbo_tblBidder.bidder_sale_id = 235)
GROUP BY dbo_tblBidder.bidder_type, Total.count
ORDER BY dbo_tblBidder.bidder_type
MS Access告诉我:
查询表达式“。
中的语法错误(缺少运算符)
然后,它突出显示来自dbo_tblBidder.bidder_number的“mber”,其中说:
dbo_tblItem ON dbo_tblItem.item_bidder_number = dbo_tblBidder.bidder_number
我不知道突出显示是否实际上是任何事物的一部分。
答案 0 :(得分:5)
当您加入2个以上的表格时,Access需要使用括号,并且对于其展示位置非常挑剔。 (虽然您的查询的一个数据源是子查询而不是实际的表,但它被视为关于连接和括号的表。)建议您在Access'查询设计器中将其构建为新查询,只是为了查看它如何放置括号为你的联合表。
“count”是一个保留字,所以我在查询中出现的地方括起来,以减少混淆数据库引擎的可能性。
对Access'db引擎使用LEFT JOIN而不是LEFT OUTER JOIN。
我认为这可能接近你所需要的。
SELECT
Total.[count],
SUM(dbo_tblItem.item_premium + dbo_tblItem.item_pr) AS SumTotal,
dbo_tblBidder.bidder_type
FROM
(dbo_tblBidder LEFT JOIN dbo_tblItem
ON (dbo_tblItem.item_bidder_number = dbo_tblBidder.bidder_number
AND dbo_tblItem.item_sale_id = dbo_tblBidder.bidder_sale_id)
)
LEFT JOIN (
SELECT COUNT(bidder_type) AS [count], bidder_type
FROM dbo_tblBidder
WHERE bidder_sale_id = 235
GROUP BY bidder_type
) AS Total
ON dbo_tblBidder.bidder_type = Total.bidder_type
WHERE dbo_tblBidder.bidder_sale_id = 235
GROUP BY dbo_tblBidder.bidder_type, Total.[count]
ORDER BY dbo_tblBidder.bidder_type;
答案 1 :(得分:0)
尝试在ON
子句中加上括号,例如
left outer join dbo_tblItem on (dbo_tblItem.item_bidder_number = dbo_tblBidder.bidder_number
and dbo_tblItem.item_sale_id = dbo_tblBidder.bidder_sale_id)
答案 2 :(得分:0)
您的问题听起来像是在Access中链接了SQL Server表 您是尝试按代码还是在Access查询设计器中执行查询?
无论您如何执行查询,都可以将其直接发送到SQL Server,从而绕过Access。
这样做的好处是可以使用SQL Server的SQL方言,IMO比Access的SQL方言更强大。
另外,根据我的经验,SQL Server比Access快。
如果您使用的是查询设计器:
您可以在查询设计器中创建传递查询:
How to create an SQL pass-through query in Access
如果您想通过代码执行查询:
这是一个示例函数,它将查询直接发送到SQL Server并返回Recordset:
Public Function OpenRecordset(ByVal SQL As String) As DAO.Recordset
Dim QD As QueryDef
Set QD = CurrentDb.CreateQueryDef("")
With QD
.Connect = "Your connection string to the SQL Server database"
.ReturnsRecords = True
.SQL = SQL
Set OpenRecordset= QD.OpenRecordset
QD.Close
End With
Set QD = Nothing
End Function
用法示例:
Public Function Test()
Dim RS As DAO.Recordset
Set RS = OpenRecordset("select getdate()")
MsgBox RS.Fields(0)
RS.Close
Set RS = Nothing
End Function
这将使用SQL Server函数getdate()
返回当前日期和时间。