Что не так с этим оператором UPDATE для MS-Access? - PullRequest
1 голос
/ 10 февраля 2011

Я пытаюсь обновить поле на основе поля из другой таблицы (PricePlan).В PricePlan у меня есть 2 поля: «Гость» и «Участник» и столбец «Цена», но в этом случае я бы хотел, чтобы «Цена» в моей другой таблице обновлялась в соответствии со значением «Гость».При отладке я получаю следующую ошибку в VS2008 «Необработанное исключение типа« System.Data.OleDb.OleDbException »произошло в System.Data.dll Дополнительная информация: Операция должна использовать обновляемый запрос.

Что не такс моим UPDATE заявлением?

UPDATE Bill 
SET Price = ( SELECT PricePlan.Price 
              FROM PricePlan 
              WHERE PricePlan.PricePlanName = 'Guest'
            )
WHERE EXISTS (Select PricePlan.Price 
              FROM PricePlan 
              WHERE PricePlan.PricePlanName ='Guest'
             );

Ответы [ 3 ]

2 голосов
/ 10 февраля 2011

Насколько я помню, эти операторы обновления больше похожи на:

UPDATE Bill
SET Price = PricePlan.Price
FROM (SELECT Price FROM PricePlan 
      WHERE PricePlanName = 'Guest')

Но я не совсем понимаю, чего вы пытаетесь достичь. Можете ли вы привести пример того, что таблицы будут содержать в сценарии «до и после»?

EDIT

На основании http://dbaspot.com/forums/ms-access/138825-select-inside-update.html, Я предполагаю, что что-то вроде этого, вероятно, будет работать:

UPDATE Bill,PricePlan 
SET Bill.Price = PricePlan.Price
WHERE PricePlan.PricePlanName = 'Guest'
AND ... (put something here to limit which bills you want to update)
1 голос
/ 10 февраля 2011

В вашем коде нет ничего «неправильного» как такового: он представляет собой промежуточный стандартный код SQL-92 и тоже хорошо отформатирован:)

К сожалению, Access (ACE, Jet, что угодно) не совместим с SQL-92, даже начального уровня. Синтаксис UPDATE является его худшим провалом, IMO. Приблизительно в 2000 году команда SQL Server взяла на себя ответственность за ядро ​​и попыталась сделать его совместимым со стандартами, но была заблокирована командой Windows, у которой слишком много кода зависело от собственного синтаксиса UPDATE . Теперь он никогда не будет реализовывать SQL-92, надежды нет.

«Доступ» является «неправильным». Я призываю вас перейти на более способный продукт SQL. SQL Server 2008 Express будет моим личным выбором.

Если вы не можете / не будете двигаться, вы вынуждены изучать собственный синтаксис Access (а не только UPDATE!) Вместе со многими другими его причудами и ограничениями.

0 голосов
/ 10 февраля 2011

Самая вопиющая ошибка в том, что нет корреляции между обновленной таблицей Bill и подзапросом!Что вы пытаетесь сделать?

Может быть, что-то вроде ниже?

UPDATE Bill inner join PricePlan on PricePlan.Id = Bill.Id
SET Bill.Price = PricePlan.Price
WHERE PricePlan.PricePlanName = 'Guest'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...