Green-sell.info

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

Access update from select

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

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

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

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

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

Есть какие-нибудь идеи?

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

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

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

Только это терпит неудачу. Это находится в самой MS Access, поэтому я не могу представить себе реальную проблему разрешений, как большинство проблем «Operation must use an updateable query», похоже, есть.

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

Этот запрос UPDATE вполне подходит:

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

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

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

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

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

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

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

7 Ответов

Я должен согласиться с комментарием Дэвида У. Фентона по поводу OP.

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

  1. перейдите к свойствам запроса (нажмите кнопку фон панели, на которой находится таблицы отображаются) и установить От ‘Unique Records’ до ‘Yes’
  2. Вариант 1 является эквивалентом добавления несколько странный вид DISTINCTROW ключевое слово для SELECT статья, например :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читать еще:  Узнать ключ офис 2020

Access update from select

Question

Trying to execute this query but getting ‘operation must use an updatable query’. Only problem I can see is that the SELECT may not return a row.

UPDATE tblFlatPkgDates As FD
SET FD.ResearchBegin =
(SELECT PD.ActualDate FROM qryPkgEffTermDates As PD, tblFlatPkgDates As FD
WHERE FD.PkgID = PD.PkgID AND PD.DateType = ‘Research begin’)

Answers

Try using an Inner Join instead of a subquery:

This may not work if there are multiple records in qryPkgEffTermDates for the PkgID, or if qryPkgEffTermDates is itself not updateable (e.g. it’s a Totals query).

A somewhat ugly getaround is to use DLookup:

John W. Vinson/MVP

  • Proposed as answer by Mark Burns — PMADN Tuesday, August 17, 2010 9:56 PM
  • Marked as answer by Fafafaalex Moderator Wednesday, August 25, 2010 8:39 AM

All replies

I don’t think that’s a valid SQl syntax for the UPDATE statement.

The Access 2003 Jet SQL reference HELp states the sytnax as foolows:

UPDATE table
SET newvalue
WHERE criteria;

Th Expression link reads:

Any combination of operators, constants, literal values, functions, and names of fields, controls, and properties that evaluates to a single value. You can use expressions as settings for many properties and action arguments, to set criteria, or define calculated fields in queries.

I do not think that a subquery satisfies that definition (even if in your case that subquery returns a single row-single column result) . but then, I’ve been wrong before.

I suppose you do it within some VBA sub. It would be easier to use a Recordset. It will allow you to avoid null values also.

Andrey V Artemyev | Saint-Petersburg, Russia

I don’t think that’s a valid SQl syntax for the UPDATE statement.

The Access 2003 Jet SQL reference HELp states the sytnax as foolows:

UPDATE table
SET newvalue
WHERE criteria ;

Th Expression link reads:

Any combination of operators, constants, literal values, functions, and names of fields, controls, and properties that evaluates to a single value. You can use expressions as settings for many properties and action arguments, to set criteria, or define calculated fields in queries.

I do not think that a subquery satisfies that definition (even if in your case that subquery returns a single row-single column result) . but then, I’ve been wrong before.

The basic structure of it is valid within SQL Server, no idea if Access can handle it.

Как обновить из SELECT в SQL Server?

на SQL Server, возможно insert в таблице с помощью SELECT о себе:

это обновление через SELECT ? У меня есть временная таблица, содержащая значения, и я хотел бы обновить другую таблицу, используя эти значения. Возможно, что-то вроде этого:

29 ответов

В SQL Server 2008 (или более), используйте MERGE

Я бы изменить отличный ответ Робина следующим образом:

без предложения WHERE вы повлияете даже на строки, которые не должны быть затронуты, что может (возможно) вызвать пересчет индекса или триггеры огня, которые действительно не должны были быть запущены.

еще одна возможность, еще не упомянутая, — просто бросить SELECT сам оператор в CTE, а затем обновите CTE.

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

это также имеет то же ограничение, что и proprietary UPDATE . FROM синтаксис, показанный в четырех других ответы. Если исходная таблица находится на стороне «один ко многим», то неопределенно, какая из возможных совпадающих Соединенных записей будет использоваться в Update (вопрос MERGE избегает вызывает ошибку при попытке обновить одну и ту же строку более одного раза).

для записи (и другие ищут, как я был), вы можете сделать это в MySQL, как это:

самый простой способ сделать это:

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

а вот еще один полезный синтаксис:

он проверяет, является ли он нулевым или нет, используя «WHERE EXIST».

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

Если вы используете в MySQL вместо SQL Server используется синтаксис:

обновление от SELECT с внутренним соединением в базе данных SQL

Читать еще:  Продление офиса 365 купить

поскольку слишком много ответов на этот пост, которые наиболее сильно проголосовали, я подумал, что дам свое предложение и здесь. Хотя вопрос очень интересный, я видел на многих сайтах форумов и сделал решение с помощью ВНУТРЕННЕЕ СОЕДИНЕНИЕ со скриншотами.

сначала я создал таблицу с именем schoolold и вставил несколько записей относительно их имена столбцов и выполнить его.

затем я выполнил выберите для просмотра вставленных записей.

затем я создал новую таблицу с именем schoolnew и аналогично выполненные выше действия.

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

Теперь Здесь Я хотите внести некоторые изменения в третью и четвертую строку, для завершения этого действия я выполняю обновление С ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

для просмотра изменений я выполняю выберите.

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

Access update from select

Question

Trying to execute this query but getting ‘operation must use an updatable query’. Only problem I can see is that the SELECT may not return a row.

UPDATE tblFlatPkgDates As FD
SET FD.ResearchBegin =
(SELECT PD.ActualDate FROM qryPkgEffTermDates As PD, tblFlatPkgDates As FD
WHERE FD.PkgID = PD.PkgID AND PD.DateType = ‘Research begin’)

Answers

Try using an Inner Join instead of a subquery:

This may not work if there are multiple records in qryPkgEffTermDates for the PkgID, or if qryPkgEffTermDates is itself not updateable (e.g. it’s a Totals query).

A somewhat ugly getaround is to use DLookup:

John W. Vinson/MVP

  • Proposed as answer by Mark Burns — PMADN Tuesday, August 17, 2010 9:56 PM
  • Marked as answer by Fafafaalex Moderator Wednesday, August 25, 2010 8:39 AM

All replies

I don’t think that’s a valid SQl syntax for the UPDATE statement.

The Access 2003 Jet SQL reference HELp states the sytnax as foolows:

UPDATE table
SET newvalue
WHERE criteria;

Th Expression link reads:

Any combination of operators, constants, literal values, functions, and names of fields, controls, and properties that evaluates to a single value. You can use expressions as settings for many properties and action arguments, to set criteria, or define calculated fields in queries.

I do not think that a subquery satisfies that definition (even if in your case that subquery returns a single row-single column result) . but then, I’ve been wrong before.

I suppose you do it within some VBA sub. It would be easier to use a Recordset. It will allow you to avoid null values also.

Andrey V Artemyev | Saint-Petersburg, Russia

I don’t think that’s a valid SQl syntax for the UPDATE statement.

The Access 2003 Jet SQL reference HELp states the sytnax as foolows:

UPDATE table
SET newvalue
WHERE criteria ;

Th Expression link reads:

Any combination of operators, constants, literal values, functions, and names of fields, controls, and properties that evaluates to a single value. You can use expressions as settings for many properties and action arguments, to set criteria, or define calculated fields in queries.

I do not think that a subquery satisfies that definition (even if in your case that subquery returns a single row-single column result) . but then, I’ve been wrong before.

The basic structure of it is valid within SQL Server, no idea if Access can handle it.

Инструкция UPDATE в T-SQL — обновление данных в Microsoft SQL Server

Всем привет! Сегодня в материале я расскажу о том, как происходит обновление данных в Microsoft SQL Server с использованием языка T-SQL, будет рассмотрена инструкция UPDATE. Иными словами, Вы узнаете, как изменить уже существующие данные в таблицах на SQL Server.

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

Заметка!

Упомянутые выше материалы:

Кроме того, для комплексного изучения языка T-SQL рекомендую пройти наши онлайн-курсы по T-SQL, на которых используется последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL.

Как обновить данные в таблицах Microsoft SQL Server?

Изменить данные в таблицах Microsoft SQL Server можно с помощью:

Однако в реальности обновление данных происходит только с использование инструкции UPDATE, так как использовать конструктор SSMS для каких-то массовых изменений невозможно, даже процесс обновления одного значения крайне неудобен. Поэтому я не использую конструктор, мне кажется, его мало кто использует.

Поэтому сегодня мы подробно поговорим об инструкции UPDATE.

Описание инструкции UPDATE в T-SQL

UPDATE – инструкция SQL, с помощью которой происходит изменение существующих данных в таблицах.

Важные моменты:

  • Если инструкция UPDATE, т.е. обновление строк, нарушает какое-нибудь ограничение или правило, или новое значение имеет несовместимый тип данных (хотя бы для одной строки), то возникнет ошибка и все изменения отменяются, никакие строки не обновляются;
  • По умолчанию инструкция UPDATE получает монопольную блокировку на целевую таблицу, которую она изменяет, это означает, что пока одна инструкция UPDATE выполняется, т.е. изменяет данные в таблице, другие инструкции не могут изменять данные в этой таблице;
  • Чтобы использовать инструкцию UPDATE, нужны соответствующие разрешения на изменение данных, а также на чтение данных, если инструкция содержит условие WHERE;
  • Если Вам нужно узнать количество строк, которые Вы обновили инструкцией UPDATE, например, для возврата в клиентское приложение или для любых других целей, то для этого Вы можете использовать функцию @@ROWCOUNT.
Читать еще:  Офис 2003 не открывает файлы xlsx

Упрощенный синтаксис UPDATE

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

UPDATE Целевая таблица SET Имя столбца = Значение

FROM Таблица источник

  • UPDATE – инструкция обновления;
  • Целевая таблица – таблица, данные в которой необходимо изменить;
  • SET – команда, которая задает список обновляемых столбцов. Каждый следующий столбец указывается через запятую;
  • Имя столбца – столбец, в котором расположены данные, которые необходимо изменить;
  • Значение – новое значение, на которое необходимо изменить значение столбца. Можно указывать как конкретное значение, так и расчётное выражение, функцию или подзапрос. Также можно указать ключевое слово DEFAULT, что будет означать, что столбцу необходимо присвоить значение по умолчанию;
  • FROM – секция, которая указывает таблицу, из которой необходимо взять новое значение столбца. Секция может содержать объединение JOIN;
  • Таблица источник – таблица, в которой расположено новое значение столбца;
  • WHERE – условие отбора строк, подлежащих обновлению.

Примеры использования инструкции UPDATE

Сейчас давайте рассмотрим несколько примеров SQL инструкций, которые будут обновлять данные в таблице инструкцией UPDATE.

Исходные данные для примеров

Для начала давайте определимся с исходными данными, чтобы Вы понимали, какие именно данные у нас есть, и что мы будем обновлять.

Также сразу скажу, что в качестве SQL сервера у меня выступает версия Microsoft SQL Server 2017 Express.

Следующая инструкция создает таблицы, которые мы будет использовать в примерах, и добавляет в них данные.

Пример обновления одного столбца всех строк таблицы

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

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

Как видите, в итоге получился очень простой запрос на обновление, мы обновили значения в столбце ProductDescription у всех строк на «Товар».

Пример обновления двух столбцов и только некоторых строк таблицы

Теперь давайте обновим два столбца, и конкретизируем строки для обновления, т.е. мы обновим не все строки в таблице, как в предыдущем примере, а только те, которые подходят под указанное нами условие (для примера Category с идентификатором 1).

В этом случае изменились значения столбцов ProductDescription и Price в строках, в которых Category = 1.

Пример использования выражений в инструкции UPDATE

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

В следующем примере в столбец ProductDescription мы добавим дополнительный текст (просто цифру 3), а значение Price мы увеличим в полтора раза. Все это мы сделаем для строки с Category = 2.

Пример обновления данных таблицы на основе данных другой таблицы

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

Для примера здесь мы скопируем название категорий из таблицы Categories, и вставим их в столбец ProductDescription таблицы Goods, объединять будем по идентификатору категории.

Пример обновления данных с использованием подзапроса

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

Для того чтобы узнать количество товаров, мы будем использовать встроенную функцию COUNT, а для преобразования числа в строку — функцию CAST. Фильтровать строки в подзапросе мы будем по идентификатору категории, значение для сравнения будем получать из основного запроса.

Как видите, все отработало так, как мы задумали.

Видео-инструкция по обновлению данных в Microsoft SQL Server

У меня на этом все, надеюсь, материал был Вам полезен, пока!

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector