Vvmebel.com

Новости с мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Update sql access

Update sql access

Инструкция UPDATE лежит в основе запросов на обновление (Update Query). При помощи запроса этого типа можно изменить значения указанных полей заданной таблицы на основе заданного набора условий. Синтаксис:

UPDATE таблица SET поле=новоеЗначение WHERE условиеОтбора

Описание параметров: таблица. Вслед за инструкцией UPDATE указывается имя таблицы, поля которой подлежат обновлению. поле=новоеЗначение. Список конструкций поле=новоеЗнанение, следующее за предложением SET, задает новые значения, присваиваемые указанным полям таблицы. условиеОтбора. В предложении WHERE задается условие, на основании которого производится обновление полей указанной таблицы. По поводу предложения WHERE можно сделать те же замечания, которые были сделаны при описании инструкции SELECT.

Обычно, инструкция UPDATE используется для обновления большого количества полей и большого количества записей, в том числе, когда записи находятся в разных таблицах (в запросах на обновление можно применять различные типы объединений (JOIN), хотя и с большой осторожностью). После выполнения непродуманно сконструированного запроса на обновление (впрочем, как и любого запроса на изменение) восстановить информацию будет невозможно. Почаще архивируйте данные!

Примеры

Приведенный в этом примере SQL-оператор служит для обновления поля ПоставкиПрекращены таблицы Товары. Имя таблицы указано в конструкции UPDATE, а конструкция SET содержит список выражений вида: поле=выражение. Аргумент поле ссылается на обновляемое поле, а значение аргумента выражение будет присвоено указанному слева от знака равенства полю. В выражении могут использоваться имена полей из таблиц, участвующих в запросе. В приведенном примере обновляемое поле одно — поле логического (Yes/No) типа ПоставкиПрекращены. Этому полю будет присвоено значение Ложь (False) для всех записей таблицы Товары, удовлетворяющих условиям конструкции WHERE.

В данном случае, конструкция WHERE содержит всего одно условие. В результате работы запроса будут обновлены только те записи, в которых поле ПоставкиПрекращены имеет значение Истина (True), остальные записи будут оставлены без изменения. Итог работы запроса, основанного на рассматриваемой в этом примере строке SQL-оператора, не зависит от конструкции WHERE. Все записи таблицы Товары в поле ПоставкиПрекращены будут иметь значение Ложь (False) независимо от того, присутствует ли конструкция WHERE в строке запроса. Однако в случае отсутствия предложения WHERE, запрос будет работать намного медленнее, поскольку обновляться будут все без исключения записи. Для таблиц, содержащих большое количество записей, разница в скорости выполнения таких запросов может быть достаточно существенной.

В этом примере SQL-оператора задействованы две таблицы — Заказы и Заказано. Инструкция UPDATE не может содержать конструкции FROM, поэтому информация об участвующих в запросе таблицах, а также о связях между этими таблицами задается в конструкции UPDATE (информация о связях может быть указана также в конструкции WHERE).

В рассматриваемом примере полю Скидка из таблицы Заказано присваивается значение 0 для тех записей, для которых поле ДатаИсполнения из связанной таблицы Заказы имеет значение Null. Другими словами, если заказ еще не выполнен, для него снимается скидка.

Для задания связи между таблицами Заказы и Заказано используется привычная для Microsoft Access конструкция INNER JOIN. Более подробно об операциях задания связи INNER JOIN, LEFT JOIN и RIGHT JOIN будет рассказано далее в этом разделе.

В этом примере демонстрируется возможность обновления сразу двух связанных таблиц за одну операцию полей. Как и в предыдущем примере, связь между таблицами Заказы и Заказано задана при помощи операции INNER JOIN, которая будет описываться далее в этом разделе. Запрос, основанный на рассматриваемой строке SQL-оператора, обновляет поля записей, соответствующих заказам, которые еще не выполнены (поле ДатаИсполнения имеет значение Null) и стоимость доставки которых больше 30. При выполнении указанных условий полю ДатаНазначения из таблицы Заказы присваивается значение, соответствующее дате 01.01.1999, а значение поля Скидка из таблицы Заказано по возможности уменьшается на 10%.

Для проверки возможности уменьшения скидки используется функция IIF, имеющая три аргумента. Первым аргументом функции является логическое выражение ([Скидка] ЗАМЕЧАНИЕ В Главе 4 уже упоминалось о том, что не каждый запрос можно использовать для обновления таблиц. Там же, в таблице 4.2, приведены признаки обновляемости запросов. В случае невозможности построения запроса на обновление нужных таблиц можно создать запрос на добавление (Append Query) или создание таблицы (Make-Table Query). Этот запрос должен добавлять во временную таблицу выборку, содержащую всю необходимую информацию. Затем создается простой запрос, обновляющий нужные таблицы на основе созданной (или сформированной) ранее временной таблицы.

SQL Update woes in MS Access — Operation must use an updateable query

I have a select query which does some text manipulation to essentially reformat a field so that I can look it up in another table:

If my first table if I have a field like «J1/2» it looks up the ID of a record in a different table with J1 and J2 in the appropriate fields.

This all works well.

Now I want to update the original table so I don’t have to do lookups using this string manipulation anymore, but my attempts at update queries end with «Operation must use an updateable query»

My SELECT statement:

Recall — this works fine and I get the necessary t2.ID out the other end.

So I want to do something like:

Only this fails. This is within MS Access itself so I can’t imagine an actual permissions problem like most of the «Operation must use an updateable query» problems seem to be.

EDIT: Trying to simplify the case that doesn’t work.

This UPDATE query is fine:

This one fails (Thanks Goedke — this example obviously fails because the subquery returns more than 1 result. I had oversimplified to try to find my problem)

So do I just have my subquery syntax wrong in some way?

EDIT: This SELECT statement is fine too:

Furthermore, using count on the select statement above shows that there is exactly 1 ID being returned per (DD,TN) combination

The simplest case I’ve now got to — using various SELECT statements I now have a table with just 2 columns — the primary key of t1 and the value I want to insert into t1.

I still can’t seem to write

where t1’s primary key is f1. Even adding WHERE t1.f1 IN (SELECT f1 FROM t2) doesn’t help. (Added to eliminate the possibility that the subquery returns 0 results)

Создан 11 фев. 09 2009-02-11 14:55:00 Paul Smith

Sorry about the edit to your question: I hit the wrong edit button :/ – Godeke 11 фев. 09 2009-02-11 16:47:44

BTW, I would highly recommend SQL Express as your back end. The reason I have not encountered this problem is that I always use a SQL engine on the back end, no matter how small the project. Access SQL is apparently broken in this case. – Godeke 11 фев. 09 2009-02-11 16:50:27

Jet SQL is not broken at all. Jet SQL has more options for making queries updatable than standard SQL92. My suggestion is to try the Jet-specifict DISTINCTROW predicate. It can often force a non-updatable query to be updatabe. – David-W-Fenton 11 фев. 09 2009-02-11 21:44:24

Читать еще:  Как установить майкрософт офис

Arguably, ACE/Jet is ‘broken’ for UPDATE because a) it does not support the SQL-92 scalar subquery syntax at all i.e. exentions to the standard can be OK but SQL-92 entry-level compliance should be considered a minimum. – onedaywhen 12 фев. 09 2009-02-12 14:31:46

. b) by not requiring the result to be a scalar, the engine is free to choose an arbitrary value i.e. results are unpredictable. I know, I know: *you’d* never be ambiguous and always write bug free code etc but the point is the engine should *force* you to choose, rather than choosing arbitrarily. – onedaywhen 12 фев. 09 2009-02-12 14:35:44

Access/JET fails to follow the SQL standard in an unexpected way: the SELECT form of the query picks up the rows and subquery correctly. It fails to do so for the same query structure in an UPDATE. There is no logical reason for that and DISTINCTROW doesn’t apply here. – Godeke 12 фев. 09 2009-02-12 15:57:01

7 ответов

A subquery of (SELECT ID FROM t2) can’t work unless there is only one record in t2. Which ID are you expecting to be used?

The error message that is being reported normally occurs when you have joins and are not including all of the primary keys necessary to update back to tables in a data bound form (for example, your original DISTINCT destroys information about keys, so if it was bound to a form, the form would not be able to save back).

The fact you are using DISTINCT there would make me suspicious that the sub query is returning more than one row in your more complex example. This is probably the most common problem with assigning out of a sub query result: under-constraining the where clause.

Another problem I have seen with assigning out of a subquery is if the syntax of the inner query is incorrect. At least with SQL 2000 and 2005 back ends, the query processor will silently fail and return NULL in such cases. (This is, as far as I can tell, a bug: I see no reason why something that will return an error at the top level would be silently permitted in a subquery. but there it is.)

EDIT: Just to ensure that neither Paul or I wasn’t going crazy, I created the following tables:

I did not put any constraints except a primary key on ID and ID2. All fields were text, which is different from what I normally use for IDs, but should be irrelevant.

A query of the form:

Failed with the same message Paul got.

works as expected, so we know the subquery syntax is not to blame.

also works as expected, so we don’t have a corrupt or non updateable destination.

Note: if I change the database backend from native to SQL 2005, the update works! A bit of googling around, and I find Access MVPs suggesting DLOOKUP to replace a subquery:

Apparently this is a bug in Access SQL, one that is avoided when using a SQL Express 2000 or higher back end. (The google results for «access update subquery» support this theory).

Создан 11 фев. 09 2009-02-11 15:18:34 Godeke

Запросы SQL для обновления данных (UPDATE)

Изучаем SQL

  • 1. Введение в SQL
  • 2. Запросы на выборку
  • 3. Условия в запросах
  • 4. Cортировка данных
  • 5. Вставка записи
  • 6. Вставка нескольких записей
  • 7. Изменение записи

Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.

В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:

UPDATE таблица SET поле = значение

Здесь, UPDATE – команда указывающая, что запрос на обновление данных;

таблица – название таблицы, в которой будет проводиться изменения;

SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;

поле – поле таблицы, в которое будет внесено изменение;

значение – новое значение, которое будет внесено в поле.

Например, если необходимо задать полю во всех строках таблицы значение равное нулю, можно выполнить такой запрос:

UPDATE goods SET price = 0

В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.

Изменение одного значения

Изменение значения всех полей в таблице необходимо крайне редко. Чаще всего необходимо поменять значение какой-то конкретной записи. Для этого в завершении строки с командой UPDATE будет добавлена директива WHERE, в которой указывается условие, определяющее с какой именно строкой нужно выполнить операцию обновления.

Для примера, нужно обновить стоимость товара с известным нам его значением num. Для этого, выполним следующий запрос:

UPDATE goods SET price = 150 WHERE num = 2

Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.

Внесение изменений в несколько строк с условием отбора

Если вспомнить все многообразие условий в запросе, можно представить себе насколько разнообразными могут быть выборки. Поэтому и запросы на обновления могут выполняться либо с одной строкой, либо с группой строк, либо со всеми строками таблицы. Все зависит от стоящей перед вами задачи, а так же с какими строками таблицы нужно выполнять операции обновления.

Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:

UPDATE goods SET price = price / 2 WHERE price >= 100

Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.

price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.

В результате выполнения такого запроса получим таблицу с измененными записями:

Обновление значений в нескольких полях строки

При необходимости обновлять сразу несколько полей, все поля с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:

UPDATE goods SET title = «утюг» , price = 300 WHERE num = 2

Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.

Выше приведены основные виды операций обновления. На их основе формируется запросы для решения большинства задач изменения данных в разработке с применением SQL.

Читать еще:  Как удалить офис 7

Еще материалы из этого раздела

Комментарии

Добрый день!
А можно ли сделать так:
UPDATE goods SET title, price = 100 WHERE num = 2

То есть присвоить двум полям одно значение?

Добрый день, Анастасия.
Простейший вариант:
UPDATE goods SET price = (RAND() * 100) WHERE num = 2

Здесь назначается случайное число до 100, так как функция RAND() вернет дробное от 0 до 1. Поэтому еще стоит обратить внимание на тип поля, когда в БД запись заносится. В данном случае, без округления, вещественное может быть записано.

Добрый день, Василий.
Одна строка таблицы — это одна запись. Если вы хотите исправить в одной записи таблице (строке таблицы), то так и будет:
UPDATE goods SET title = «утюг», price = 300 WHERE num = 2

title = «утюг», price = 300 — для каждого столбца строки.

Добрый день, Василий.

Чтобы реализовать это именно одним запросом, можно сделать так. Но на мой взгляд, стоит делать проще и понятнее для себя. Ведь для сборки этого запроса вы так же будете использовать цикл. Вопрос в том, что эффективнее: реализовать циклически сложный запрос или циклически выполнить несколько простых запросов.

Подобное решение, как мне кажется применимо, например, в обновлении прайс-листа. Но, т.к. задача не часто выполнимая, то нет смысла усложнять ее, пусть даже для повышения скорости выполнения. Хотя все зависит от конкретных условий.

Надеюсь, я ответил на ваш вопрос, Василий.

Есть простая таблица в sql. И по нажатию на кнопку сохранить выполняется сохранение изменений. Запрос такой:
$query = «UPDATE `comp` SET `comp_login`= ‘$comp_login’, `comp_name` = ‘$comp_name’, `see` = ‘$see’, `p_status` = ‘$p_status’, `comp_text` = ‘$comp_text’ WHERE `id_comp` = ‘$id_comp’ AND `id_clients` = ‘$id_clients'»;
Значения переменных берутся с пост запроса. Примерно такие: $comp_login = mysql_real_escape_string($request[‘comp_login’]);

Вопрос: Мне нужно знать была ли обновлена строка. Даже если ничего не было изменено, то тоже нужно вернуть истину.
Если проверить так: if(mysql_affected_rows() >0) , то возвращается ложь, если ничего не было изменено.

А if(mysql_affected_rows() == -1) выполняется только, если есть конкретные ошибки. Т.е. в таблице есть стpока enum со значениями ‘0’,’1′. Если я в это поле отправляю текст, то ставит 0 и пишет нет ошибки.

Как обычно проверяют такие условия?

А можете ли помочь с таким вопросом:
Есть сайт технической поддержки. И есть пользователи, которые оставляют на нем заявку в компанию. На нем есть таблица с полями: id_client(id пользователя AI, PK), name_client(Имя потльзователя), status(один ко многим), date_r(дата регистрации).

Статусы у всех пользователей будут разные. Например:
у пользователя 1: открыто, отменено, закрыто, передано, принято.
у пользователя 2: открыто, отменено, закрыто, исполнено, в ожидании.
у каждого клиента должны быть видны несколько статусов для выбора (только ему принадлежащие), а у другого клиента (другие статусы, принадлежащие именно ко второму клиенту)

Статусы в любое время могут добавляться( не удаляются).
Я пока придумал только так:
1. вариант:
Вторая таблица такая: id_status, id_client, open, close, cancelled, sent, accepted.
id_status — AI PK, id_client — указывает на первую таблицу на пользователя, другие поля сами статусы и имеют значение enum: ‘0’, ‘1’ — в зависимости присутствует для пользователя ставиться 0 или 1.

Когда необходимо добавлять статус какому либо клиенту сначала ставлю 1 для нужного пользователя, а для всех других проставляю 0.
2 Вариант.
Во второй таблице statuses (id_statuses, name_status) записаны все статусы. В таблице пользователя в поле status записать несколько значений id_statuses разделенных разделителями, которые принадлежат ему.

Может можно реализовать попроще?

Добрый день, Иван.
Не знаю, правильно ли я понял вопрос.
Я бы сделал гораздо больше таблиц: пользователи, статусы, заявки, статусы_заявки. Последняя в случае, если одной заявке может соответствовать несколько статусов. Если нет, то она не нужна.

Например, если нужно чтобы пользователю могло быть назначено несколько статусов, то: сама таблица пользователя (id, имя, прочее), список_статусов (id, название, . ), статусы_пользователя (id, id_пользователя, id_статуса). Таим образом у вас будет обеспечена и целостность данных и не будет в таблицах не будет избыточности.

Проблемы с обновлением SQL в MS Access — Операция должна использовать обновляемый запрос

У меня есть запрос выбора, который выполняет некоторые манипуляции с текстом, чтобы по существу переформатировать поле, чтобы я мог найти его в другой таблице:

Если в моей первой таблице есть поле типа «J1/2», он ищет идентификатор записи в другой таблице с J1 и J2 в соответствующих полях.

Это все хорошо работает.

Теперь я хочу обновить исходную таблицу, чтобы мне больше не приходилось выполнять поиск с использованием этой манипуляции со строками, но мои попытки обновить запросы заканчиваются «Операция должна использовать обновляемый запрос»

Мое утверждение SELECT:

Напомним, это работает нормально, и я получаю необходимый t2.ID на другом конце.

Поэтому я хочу сделать что-то вроде:

Только это не удается. Это происходит внутри самого MS Access, поэтому я не могу представить себе фактическую проблему с разрешениями, как кажется, что большинство проблем «Операция должна использовать обновляемый запрос».

РЕДАКТИРОВАТЬ: Попытка упростить случай, который не работает.

Этот запрос ОБНОВЛЕНИЯ в порядке:

Это не удается (спасибо Гедке — этот пример явно не работает, потому что подзапрос возвращает более 1 результата. Я упростил задачу, чтобы попытаться найти свою проблему)

Так что у меня просто неверный синтаксис подзапроса?

РЕДАКТИРОВАТЬ: Это утверждение SELECT тоже хорошо:

Кроме того, использование счетчика в приведенном выше операторе выбора показывает, что для комбинации (DD, TN) возвращается ровно 1 идентификатор.

Простейший случай, который я сейчас получил — используя различные операторы SELECT, у меня теперь есть таблица с двумя столбцами — первичный ключ t1 и значение, которое я хочу вставить в t1.

Я все еще не могу написать

где первичным ключом t1 является f1. Даже добавление WHERE t1.f1 IN (SELECT f1 FROM t2) не помогает. (Добавлено, чтобы исключить возможность того, что подзапрос возвращает 0 результатов)

7 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Я должен взвесить комментарий Дэвида У. Фентона по поводу ОП.

Это очень раздражающая проблема с Jet/ACE. Но попробуйте либо:

  1. перейти к свойствам запроса (нажмите фон панели, где таблицы отображаются) и установить «Уникальные записи» на «Да»
  2. Вариант 1 является эквивалентом добавления несколько странно выглядящий DISTINCTROW ключевое слово для SELECT пункт, например

Это решает так много проблем, связанных с этим сообщением об ошибке, что это почти смешно.

Это MS Access в двух словах — если вы не знаете секретный обходной путь для проблемы x, вы можете потратить несколько дней, пытаясь найти ответ. Знать 10000 обходных путей для программы Access. Достаточно ли этого предупреждения для непосвященных?

Это сработало для меня (Access 2000)

Я не прочитал всю ветку, но это решение, которое я использую:

и это прекрасно работает в MS Access для меня.

Читать еще:  Установка офиса на макбук

Подзапрос (SELECT ID FROM t2) не может работать, если в t2 только одна запись. Какой идентификатор вы ожидаете использовать?

Сообщение об ошибке, о котором сообщается, обычно появляется, когда у вас есть объединения, и в него не включены все первичные ключи, необходимые для обновления таблиц в форме с привязкой к данным (например, исходный DISTINCT уничтожает информацию о ключах, поэтому, если он был связан в форму, форму не сможет сохранить обратно).

Тот факт, что вы используете DISTINCT, может вызвать у меня подозрение, что подзапрос возвращает более одной строки в вашем более сложном примере. Это, вероятно, самая распространенная проблема с присваиванием результата подзапроса: недопущение предложения where.

Другая проблема, с которой я столкнулся при назначении из подзапроса, — это неправильный синтаксис внутреннего запроса. По крайней мере, с бэкэндами SQL 2000 и 2005 процессор запросов молча завершится сбоем и в таких случаях вернет NULL. (Насколько я могу судить, это ошибка: я не вижу причины, по которой что-то, что будет возвращать ошибку на верхнем уровне, было бы молча разрешено в подзапросе. но это так.)

РЕДАКТИРОВАТЬ: Просто чтобы убедиться, что ни Пол, ни я не сходили с ума, я создал следующие таблицы:

Я не ставил никаких ограничений, кроме первичного ключа на ID и ID2. Все поля были текстовыми, что отличается от того, что я обычно использую для идентификаторов, но не должно иметь значения.

Не удалось с тем же сообщением, которое получил Пол.

работает как положено, поэтому мы знаем, что синтаксис подзапроса не виноват.

также работает как положено, поэтому у нас нет поврежденного или не обновляемого места назначения.

Примечание: если я изменю базу данных базы данных с нативной на SQL 2005, обновление будет работать! Немного погуглил, и я обнаружил, что Access MVP предлагают DLOOKUP заменить подзапрос:

По-видимому, это ошибка в Access SQL, которую следует избегать при использовании SQL Express 2000 или более поздней версии. (Результаты Google для «подзапроса обновления доступа» подтверждают эту теорию).

У меня была та же ошибка («Операция должна использовать обновляемый запрос») при использовании Access 2010, и я выполнял простой запрос на обновление с внутренним объединением. Все, что я делал, это добавлял первичный ключ к таблице, к которой я присоединялся (у меня уже был один, конечно, к таблице, которую я обновлял), и все работало.

Проблемы с обновлением SQL в MS Access-операция должна использовать обновляемый запрос

у меня есть запрос select, который выполняет некоторые текстовые манипуляции, чтобы по существу переформатировать поле, чтобы я мог посмотреть его в другой таблице:

если моя первая таблица если у меня есть поле типа «J1/2», он ищет идентификатор записи в другой таблице с J1 и J2 в соответствующих полях.

это все хорошо работает.

теперь я хочу обновить исходную таблицу, поэтому мне больше не нужно искать с помощью этой манипуляции со строками, но мои попытки обновления запросы заканчиваются на «операция должна использовать обновляемый запрос»

мое заявление SELECT:

напомним-это отлично работает, и я получаю необходимый t2.Идентифицировать другой конец.

так я хочу сделать что-то вроде:

только это не удается. Это в самом MS Access, поэтому я не могу представить себе фактическую проблему с разрешениями, как и большинство проблем «операция должна использовать обновляемый запрос». быть.

EDIT: попытка упростить случай, который не работает.

этот запрос обновления в порядке:

это не удается (спасибо Goedke-этот пример, очевидно, терпит неудачу, потому что подзапрос возвращает более 1 результата. Я упростил, чтобы попытаться найти мою проблему)

Итак, у меня просто синтаксис подзапроса в некотором роде неправильный?

EDIT: эта инструкция SELECT тоже прекрасна:

Furthermore, используя отсчет в инструкции select выше показано,что на комбинацию (DD, TN) возвращается ровно 1 ID

самый простой случай, который я теперь должен-используя различные операторы SELECT у меня теперь есть таблица всего с 2 столбцами-первичный ключ t1 и значение, которое я хочу вставить в t1.

Я все еще не могу писать

где первичным ключом t1 является f1. Даже добавляя, где t1.f1 IN (выберите f1 из t2) не помогает. (Добавлено для устранения вероятность того, что подзапрос возвращает 0 результатов)

7 ответов

подзапрос (выберите ID из t2) не может работать, если в t2 нет только одной записи. Какой ID вы ожидаете использовать?

сообщение об ошибке, о котором сообщается, обычно возникает, когда у вас есть соединения и не включают все первичные ключи, необходимые для обновления до таблиц в форме с привязкой к данным (например, ваш исходный DISTINCT уничтожает информацию о ключах, поэтому, если он был привязан к форме, форма не сможет сохранить обратно).

факт вы используете DISTINCT, это заставит меня заподозрить, что суб-запрос возвращает более одной строки в вашем более сложном примере. Это, вероятно, самая распространенная проблема с назначением результата подзапроса: недостаточное ограничение предложения where.

еще одна проблема, которую я видел с назначением из подзапроса, — это если синтаксис внутреннего запроса неверен. По крайней мере, с SQL 2000 и 2005 back ends процессор запросов будет молча сбой и возврат NULL в таких случаях. (Это, насколько я могу судить, ошибка: Я не вижу причин, почему что-то, что вернет ошибку на верхнем уровне, будет молча разрешено в подзапросе. но это так.)

изменить: Чтобы убедиться, что ни пол, ни я не сходим с ума, я создал следующие таблицы:

Я не поместите любые ограничения, кроме первичного ключа на ID и ID2. Все поля были текстовыми, что отличается от того, что я обычно используйте для идентификаторов, но не имеет значения.

не удалось с тем же сообщением, которое получил Пол.

работает, как ожидалось, поэтому мы знаем, что синтаксис подзапроса не виноват.

также работает, как ожидалось, поэтому у нас нет поврежденного или не обновляемого назначения.

Примечание: если я изменю бэкэнд базы данных с собственного на SQL 2005, обновление работает! Немного погуглить, и я нахожу Access MVPs, предлагающий DLOOKUP заменить подзапрос:

по-видимому, это ошибка в Access SQL, которая избегается при использовании SQL Express 2000 или выше. (Результаты google для подзапроса «обновление доступа» поддерживают эту теорию).

Я должен взвесить комментарий Дэвида У. Фентона по поводу операции.

Это очень раздражает проблема с Jet / ACE. Но попробуйте либо:

  1. перейдите к свойствам запроса (нажмите фон панели, на которой таблицы отображаются) и set «Уникальные записи» на «Да»
  2. Вариант 1 эквивалентен добавлению несколько странный вид DISTINCTROW ключевое слово в SELECT предложения, например

Это решает так много проблем, связанных с этим сообщением об ошибке, что это почти смешно.

Это MS Access в двух словах-если вы не знаете секретный обходной путь для проблемы x, вы можете занять несколько дней, пытаясь найти ответ. Знать 10 000 обходных путей — значит программировать доступ. Достаточно ли этого предупреждения для непосвященных ?

Ссылка на основную публикацию
Adblock
detector
×
×