Как ОБНОВИТЬ все столбцы записи без необходимости перечислять каждый столбец
Я пытаюсь выяснить, есть ли способ обновить запись без необходимости перечислять каждое имя столбца, которое должно быть обновлено.
Например, было бы неплохо, если бы я мог использовать что-то похожее на:
// the parts inside braces are what I am trying to figure out
UPDATE Employee
SET {all columns, without listing each of them}
WITH {this record with id of '111' from other table}
WHERE employee_id = '100'
Если это можно сделать, что было бы самым простым или эффективным способом написания такого запроса?
Ответы
Ответ 1
Это невозможно.
То, что вы пытаетесь сделать, не является частью спецификации SQL и не поддерживается никаким поставщиком базы данных. См. Спецификации операторов SQL UPDATE для MySQL, Postgresql, MSSQL, Oracle, Firebird, Teradata. Каждый из них поддерживает только синтаксис:
UPDATE table_reference
SET column1 = {expression} [, column2 = {expression}] ...
[WHERE ...]
Ответ 2
Это не возможно, но..
ты можешь это сделать:
begin tran
delete from table where CONDITION
insert into table select * from EqualDesingTabletoTable where CONDITION
commit tran
быть осторожным с полями идентичности.
Ответ 3
Как насчет использования Merge?
https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx
Он дает вам возможность запускать вставки, обновление и удаление. Еще один совет: если вы собираетесь обновлять большой набор данных с индексами, а исходное подмножество меньше вашей цели, но обе таблицы очень большие, сначала переместите изменения во временную таблицу. Я попытался объединить две таблицы, каждая из которых составляла почти два миллиона строк, а 20 записей занимали 22 минуты. Как только я переместил дельты на временную таблицу, потребовалось несколько секунд.
Ответ 4
вы могли бы сделать это, удалив столбец в таблице и добавив столбец назад и добавив значение по умолчанию того, что вам было нужно. то для сохранения этого потребуется перестроить таблицу
Ответ 5
Если вы используете Oracle, вы можете использовать rowtype
declare
var_x TABLE_A%ROWTYPE;
Begin
select * into var_x
from TABLE_B where rownum = 1;
update TABLE_A set row = var_x
where ID = var_x.ID;
end;
/
учитывая, что TABLE_A и TABLE_B имеют одинаковую схему
Ответ 6
Вот хардкорный способ сделать это с помощью SQL SERVER. Тщательно продумайте безопасность и целостность, прежде чем попробовать.
При этом используется схема для получения имен всех столбцов, а затем составляется большой оператор обновления для обновления всех столбцов, кроме столбца идентификатора, который используется для объединения таблиц.
Это работает только для одного ключа столбца, а не для композитов.
использование: EXEC UPDATE_ALL 'source_table', 'destination_table', 'id_column'
CREATE PROCEDURE UPDATE_ALL
@SOURCE VARCHAR(100),
@DEST VARCHAR(100),
@ID VARCHAR(100)
AS
DECLARE @SQL VARCHAR(MAX) =
'UPDATE D SET ' +
-- Google 'for xml path stuff' This gets the rows from query results and
-- turns into comma separated list.
STUFF((SELECT ', D.'+ COLUMN_NAME + ' = S.' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @DEST
AND COLUMN_NAME <> @ID
FOR XML PATH('')),1,1,'')
+ ' FROM ' + @SOURCE + ' S JOIN ' + @DEST + ' D ON S.' + @ID + ' = D.' + @ID
--SELECT @SQL
EXEC (@SQL)