Мне нужно обновить эту таблицу в SQL Server данными из его родительской таблицы, см. Ниже:
Стол: продажа
id (int)
udid (int)
assid (int)
Таблица: уд
id (int)
assid (int)
sale.assid
содержит правильное значение для обновления ud.assid
.
Какой запрос будет делать это? Я думаю о, join
но я не уверен, если это возможно.
sql
sql-server
tsql
sql-server-2005
sql-update
Муравей Свифт
источник
источник
Ответы:
Синтаксис строго зависит от того, какую СУБД SQL вы используете. Вот несколько способов сделать это в ANSI / ISO (он же должен работать на любой СУБД SQL), MySQL, SQL Server и Oracle. Имейте в виду, что предложенный мной метод ANSI / ISO, как правило, будет намного медленнее, чем два других метода, но если вы используете СУБД SQL, отличную от MySQL, SQL Server или Oracle, то это может быть единственный путь (например, если ваша СУБД SQL не поддерживает
MERGE
):ANSI / ISO:
MySQL:
SQL Server:
PostgreSQL:
Обратите внимание, что таблица назначения не должна повторяться в
FROM
предложении для Postgres.Oracle:
SQLite:
источник
set assid = s.assid
должен бытьset u.assid = s.assid
.=
возвращает более одной строки?update ud set assid = s.assid
Это должно работать в SQL Server:
источник
Postgres
источник
Стандартный подход SQL будет
На SQL Server вы можете использовать соединение
источник
WHERE
предложении, если хотите сопоставить дополнительные столбцы.PostgreSQL :
источник
Упрощенный запрос на обновление с использованием JOIN- нескольких таблиц.
Примечание. First_table, second_table, third_table и some_column, например 123456, являются именами демонстрационных таблиц, именами столбцов и идентификаторами. Замените их действительными именами.
источник
Еще один пример, почему SQL на самом деле не переносим.
Для MySQL это будет:
Для получения дополнительной информации прочитайте обновление нескольких таблиц: http://dev.mysql.com/doc/refman/5.0/en/update.html
источник
Teradata Aster предлагает еще один интересный способ достижения цели:
источник
Я думал, что SQL-Server в верхнем посте будет работать для Sybase, поскольку они оба T-SQL, но, к сожалению, нет.
Для Sybase я обнаружил, что обновление должно быть на самой таблице, а не на псевдониме:
источник
Следующий оператор с ключевым словом FROM используется для обновления нескольких строк с помощью объединения
источник
MySQL
Вы получите наилучшую производительность, если забудете предложение where и поместите все условия в выражение ON.
Я думаю, это потому, что запрос сначала должен объединить таблицы, а затем выполнить предложение where, поэтому, если вы можете уменьшить то, что требуется для объединения, это быстрый способ получить результаты / выполнить обновление.
пример
сценарий
У вас есть таблица пользователей. Они могут войти в систему, используя свое имя пользователя или адрес электронной почты или account_number. Эти учетные записи могут быть активными (1) или неактивными (0). Эта таблица имеет 50000 строк
Затем у вас есть таблица пользователей, которую нужно отключить за один раз, потому что вы обнаружите, что они все сделали что-то плохое. Эта таблица, однако, имеет один столбец со смешанными именами пользователей, адресами электронной почты и номерами счетов. Он также имеет индикатор has_run, который должен быть установлен в 1 (true), когда он был запущен
запрос
аргументация
Если бы нам пришлось присоединиться только к условиям ИЛИ, по сути, нужно было бы проверить каждую строку 4 раза, чтобы увидеть, должно ли оно присоединиться, и потенциально вернуть намного больше строк. Однако, предоставляя ему больше условий, он может «пропустить» много строк, если они не удовлетворяют всем условиям при соединении.
бонус
Это более читабельно. Все условия находятся в одном месте, а строки для обновления - в одном месте
источник
И в MS ДОСТУП:
источник
Самый простой способ - использовать Общее табличное выражение (CTE), введенное в SQL 2005
источник
источник
Попробуйте это, я думаю, это будет работать для вас
источник
Для SQLite используйте свойство RowID для обновления:
источник