我收到一条错误消息,指出我没有指定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)
答案 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
来自Orders
,Price
和Qty
来自OrderLine
。我不知道Last
代表什么。
答案 1 :(得分:1)
ORDER BY子句与您在SELECT列表中指定的内容无关。例如,可以通过您实际上不包含在输出选择列表中的字段进行排序。
因此,您需要确保Order by列表中的字段不具有歧义。