MS Access HW Query在某处丢失明显的错误?

时间:2009-06-27 20:58:42

标签: sql ms-access

我收到一条错误消息,指出我没有指定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)   

2 个答案:

答案 0 :(得分:2)

您的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代表什么。

答案 1 :(得分:1)

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

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