MS Access HW Query где-то отсутствует очевидная ошибка? - PullRequest
1 голос
/ 28 июня 2009

Я получаю сообщение о том, что я не указал таблицу 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;  

Когда я нажимаю run, он все время говорит, что 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 ]

2 голосов
/ 28 июня 2009

Ваше предложение 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 голос
/ 28 июня 2009

Предложение ORDER BY не зависит от того, что вы указали в списке SELECT. Например, можно упорядочить по полю, которое вы на самом деле не включили в список выбора вывода.

Следовательно, вы должны быть уверены, что поля в списке Упорядочить не являются двусмысленными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...