【问题标题】:MS Access HW Query Missing Obvious Error Somewhere?MS Access 硬件查询在某处缺少明显错误?
【发布时间】:2009-06-27 20:58:42
【问题描述】:

我收到一条错误消息,指出我没有指定 OrdID 的表:

这是我所拥有的:

SELECT Last, OrderLine.OrdID, OrdDate, SUM(Price*Qty)  
    FROM ((Cus INNER JOIN Orders ON Cus.CID=Orders.CID)
        INNER JOIN OrderLine
            ON Orders.OrdID=OrderLine.OrdID)
        INNER JOIN ProdFabric
            ON OrderLine.PrID=ProdFabric.PrID   
            AND OrderLine.Fabric=ProdFabric.Fabric  
    GROUP BY Last  
    ORDER BY Last DESC, OrdID DESC;  

当我点击运行时,它一直说OrdID 可以引用 FROM 子句中列出的多个表。

为什么我已经指定了为OrdID选择哪个表。

表格:

Cus (**CID**, Last, First, Phone)  
Orders (**OrdID**, OrdDate, ShipDate, CID)  
Manu (**ManuID**, Name, Phone, City)  
Prods (**PrID**, ManuID, Category)  
ProdFabric (**PrID**, **Fabric**, Price)  
Orderline (**OrdId**, **PrID**, Fabric, Qty)   

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    您的 ORDER BY 子句是有效的 SQL-92 语法。

    遗憾的是,Access 数据库引擎不符合 SQL-92。它不允许您使用来自SELECT 子句的列相关名称(“别名”)。如果你用过这个:

    SUM(Price * Qty) AS total_price
    ...
    ORDER BY total_price
    

    您会收到错误消息。 (顺便说一句:无论如何,您应该考虑给这个表达式一个列相关名称。)

    Access 数据引擎需要列名或表达式(后者在 SQL-92 中是非法的),而不是相关名称;指定的列不需要出现在SELECT 子句中(在 SQL-92 中同样是非法的)。因为FROM子句中的任何表中的任何列都可以使用,所以需要用表名消除它们的歧义;如果您在FROM 子句中使用了表相关名称,那么您必须在ORDER BY 子句中使用它(我不制定规则!)

    为了满足 Access 数据库引擎的要求,我认为您需要将 ORDER BY 子句更改为:

    ORDER BY Last DESC, OrderLine.OrdID DESC; 
    

    顺便说一句,我认为如果您在 SELECT 子句中使用表名限定列,即使它们在上下文中是明确的(我发现使用完整表名有点罗嗦,并且更喜欢短表相关名称,在数据字典中指定并在所有查询中一致使用)。目前我只能猜测OrdDate 来自OrdersPriceQty 来自OrderLine。我不知道Last 代表什么。

    【讨论】:

      【解决方案2】:

      ORDER BY 子句与您在 SELECT 列表中指定的内容无关。例如,可以按您实际上并未包含在输出选择列表中的字段进行排序。

      因此,您需要确保 Order by 列表中的字段没有歧义。

      【讨论】:

      • 啊错过了,谢谢。我解决了这个问题,但现在我得到了:“您尝试执行的查询不包含指定表达式 'OrdID' 作为聚合函数的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多