2011-10-25 113 views
4

我有这个查询是应该在MS Access中使用,但数据库是一个SQL数据库。当我在SQL环境中运行这个查询时,它完美地工作。但是,在MS Access中运行时,出现错误。我从一开始就不了解SQL(来自MySQL),甚至不了解MS Access。MS访问SQL查询问题

该查询应该给我一个投标人类型中对某件商品(无论他们是否赢得)投标的总人数,该投标人类型中赢得的物品的总价格以及投标人类型,全部用于单一拍卖。以下是下面的查询。

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

我不知道突出显示是否实际上是否包含任何内容。

回答

5

当你加入2页以上的表,Access需要括号内为他们的位置的要求非常挑剔。 (虽然你的查询的一个数据源是一个子查询而不是实际的表,但它与关于连接和括号的表相同。)建议你在Access的查询设计器中将它作为一个新的查询来建立,只是为了看看它如何放置括号为你的连接表。

“count”是一个保留字,所以我将它包含在查询中的任意位置,以减少混淆数据库引擎的机会。

对于Access的数据库引擎,使用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; 
+0

噢,我的天哪,这工作!你是我的新英雄〜非常感谢你 – James

+0

“你的查询的一个数据源是一个子查询,而不是一个真正的表” - 这是什么SQL标准调用一个“派生表”并进一步指定“一个表是一个基表,一个查看表或一个派生表”。 – onedaywhen

+1

但是,使用Access的查询设计器的另一面是生成的SQL代码经常verbose和(([full] [of])(([pointless])(([brackets] and [parens])))),让人难以阅读。 – onedaywhen

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) 
+0

我已经试过了,但后来它说了同样的错误,但 '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计数,bidder_type',而不是 – James

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

+0

我想看看James的查询如何从SQL Server的SQL方言的附加功能中受益。我在那个上画了一个空白。 – HansUp

+0

@HansUp:什么“在那个上画空白”是什么意思? (英语不是我的母语) –

+0

对不起!画空白意味着我无法识别任何好处。另一个类似的美国习惯用法是“空手而去”。 (这可能也没有帮助!)不成功的东西。 – HansUp