MS访问SQL查询问题

时间:2011-10-25 15:53:13

标签: sql sql-server ms-access

我有这个应该在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

我不知道突出显示是否实际上是任何事物的一部分。

3 个答案:

答案 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()返回当前日期和时间。