В SQL Server можно INSERT
создать таблицу с помощью SELECT
инструкции:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Возможно ли обновить через SELECT
? У меня есть временная таблица, содержащая значения, и я хотел бы обновить другую таблицу, используя эти значения. Возможно, что-то вроде этого:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
jamesmhaley
источник
источник
SET Table.other_table_id = @NewValue
), измените оператор ON на что-то вродеON Table.id = @IdToEdit AND other_table.id = @NewValue
В SQL Server 2008 (или лучше) используйте
MERGE
В качестве альтернативы:
источник
MERGE
может также использоваться для записи "Upserting"; то есть,UPDATE
если совпадающая запись существует,INSERT
новая запись, если не найдено совпаденийUPDATE
чемMERGE
, люди только что научились жить с ними, и они становятся частью ландшафта («особенности»). Учтите, что блогов не было, когдаUPDATE
был новый ребенок на блоке.источник
SET Table_A.col1 = SUM(Table_B.col1)
(или любую другую функцию агрегирования). Так что лучше, чем ответ Робин Дей для этой цели.Я бы изменил отличный ответ Робина на следующее:
Без предложения WHERE вы затронете даже те строки, которые не должны быть затронуты, что может (возможно) вызвать пересчет индекса или триггеры срабатывания, которые действительно не должны запускаться.
источник
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
является более кратким.В одну сторону
источник
Еще одна возможность, о которой еще не говорилось, - просто поместить само
SELECT
выражение в CTE и затем обновить CTE.Преимущество этого заключается в
SELECT
том, что сначала легко выполнить оператор самостоятельно, чтобы проверить результаты, но он требует, чтобы вы определили псевдонимы столбцов, как указано выше, если они названы одинаково в исходной и целевой таблицах.Это также имеет то же ограничение, что и собственный
UPDATE ... FROM
синтаксис, показанный в четырех других ответах. Если исходная таблица находится на множестве сторон соединения «один ко многим», то неясно, какая из возможных совпадающих соединенных записей будет использоваться вUpdate
(проблема, которую можноMERGE
избежать, вызвав ошибку при попытке обновить один и тот же ряд более одного раза).источник
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Для записи (и других, ищущих, как я), вы можете сделать это в MySQL следующим образом:
источник
Используя псевдоним:
источник
Простой способ сделать это:
источник
Это может быть нишевой причиной для обновления (например, в основном используемой в процедуре), или может быть очевидным для других, но также следует указать, что вы можете выполнить оператор update-select без использования соединения (в случае, если таблицы, между которыми вы обновляете, не имеют общего поля).
источник
Вот еще один полезный синтаксис:
Он проверяет, является ли он нулевым или нет, используя «ГДЕ СУЩЕСТВУЕТ».
источник
Я добавляю это только для того, чтобы вы могли увидеть быстрый способ написать это, чтобы вы могли проверить, что будет обновлено, прежде чем делать обновление.
источник
Если вы используете MySQL вместо SQL Server, синтаксис:
источник
ОБНОВЛЕНИЕ от SELECT с ВНУТРЕННИМ СОЕДИНЕНИЕМ в Базе данных SQL
Так как в этом посте слишком много ответов, за которые проголосовали наиболее активно, я подумала, что здесь я тоже приведу свое предложение. Хотя вопрос очень интересный, я видел на многих форумах и нашел решение, используя INNER JOIN со скриншотами.
Сначала я создал таблицу с именем schoolold, вставил несколько записей относительно имен столбцов и выполнил ее.
Затем я выполнил команду SELECT для просмотра вставленных записей.
Затем я создал новую таблицу с именем schoolnew и выполнил аналогичные действия над ней.
Затем, чтобы просмотреть вставленные в него записи, я выполняю команду SELECT.
Теперь, здесь я хочу внести некоторые изменения в третьей и четвертой строке, чтобы завершить это действие, я выполняю команду UPDATE с INNER JOIN .
Для просмотра изменений я выполняю команду SELECT .
Вы можете увидеть, как третья и четвертая записи таблицы школьных номеров легко заменяются таблицами школьных , используя INNER JOIN с оператором UPDATE.
источник
И если вы хотите присоединиться к столу с самим собой (что не будет происходить слишком часто):
источник
targett1
иsourcet1
вместо (или также) комментариев.В следующем примере используется производная таблица, оператор SELECT после предложения FROM, для возврата старых и новых значений для дальнейших обновлений:
источник
Обновление через
CTE
более читабельно, чем другие ответы здесь:источник
Если вы используете SQL Server, вы можете обновить одну таблицу из другой, не указывая соединение, и просто связать две таблицы из
where
предложения. Это делает намного более простой запрос SQL:источник
Консолидация всех разных подходов здесь.
Пример структуры таблицы приведен ниже и будет обновлен с Product_BAK до таблицы Product.
Товар
Product_BAK
1. Выберите обновление
2. Обновить с помощью общего табличного выражения
3. Слияние
В этом операторе Merge мы можем сделать вставку, если не найдем подходящую запись в целевом объекте, но существуем в источнике и найдем синтаксис:
источник
Другой способ - использовать производную таблицу:
Образец данных
источник
Чтобы убедиться, что вы обновляете то, что хотите, сначала выберите
источник
Существует даже более короткий метод, и он может вас удивить:
Примерный набор данных:
Код:
источник
Использование:
ИЛИ:
ИЛИ:
Если имя столбца идентификатора в обеих таблицах одинаковое, просто поместите имя таблицы перед обновляемой таблицей и используйте псевдоним для выбранной таблицы, то есть:
источник
В принятом ответе после:
Я бы добавил:
Обычно я помещаю все в транзакцию с откатом и использую
"OUTPUT"
: таким образом я вижу все, что должно произойти. Когда я доволен тем, что вижу, яROLLBACK
превращаюсь вCOMMIT
.Мне обычно нужно документировать то, что я сделал, поэтому я использую эту
"results to Text"
опцию, когда запускаю откатный запрос и сохраняю как сценарий, так и результат OUTPUT. (Конечно, это не практично, если я изменил слишком много строк)источник
источник
Приведенное ниже решение работает для базы данных MySQL:
источник
Другой способ обновления из оператора select:
источник
Вариант 1. Использование внутреннего соединения:
Вариант 2: связанный подзапрос
источник
Синтаксис оператора UPDATE при обновлении одной таблицы данными из другой таблицы в SQL Server
источник
Вы можете использовать это для обновления в SQL Server
источник