Как ОБНОВИТЬ все столбцы записи без необходимости перечислять каждый столбец

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

Например, было бы неплохо, если бы я мог использовать что-то похожее на:

// 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)