Обновить несколько столбцов в SQL

166

Есть ли способ обновить несколько столбцов на сервере SQL так же, как используется оператор вставки?

Что-то вроде:

Update table1 set (a,b,c,d,e,f,g,h,i,j,k)=
(t2.a,t2.b,t2.c,t2.d,t2.e,t2.f,t2.g,t2.h,t2.i,t2.j,t2.k)
from table2 t2
where table1.id=table2.id

Или что-то в этом роде, а не так:

update table set a=t2.a,b=t2.b etc 

что может быть довольно утомительно писать, если у вас более 100 столбцов.

Джо
источник
это звучит довольно подвержено ошибкам
AD7six
Если вы делаете это программно, используйте параметризованные запросы, и вам нужно всего лишь написать это один раз. Если вы делаете это вручную, используйте редактор SQL Management Studio и вводите данные непосредственно в строку, а не пишите запрос.
Дэн Бешард

Ответы:

89

«Утомительный путь» - это стандартный SQL и то, как это делают основные СУБД.

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

ГБН
источник
5
Так нет ли другого способа сделать это в MSSQL?
Джо
4
@Joe: нет. См. Ответ Алекса К ниже ( stackoverflow.com/a/9079904/27535 ), есть запрос к MS, чтобы добавить его
gbn
я думаю использовать 1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
DeLe
Согласитесь общая проблема проектирования, но существуют обстоятельства, когда может потребоваться массовая проверка / очистка данных. В настоящее время я занимаюсь этим, и в SQL Server 2012 вы можете теперь обновлять более 1 столбца на каждый ответ @John Woo ниже.
Хилари
201

Попробуй это:

UPDATE table1 
SET a = t2.a, b = t2.b, .......
FROM table2 t2
WHERE table1.id = t2.id

Это должно работать на большинстве диалектов SQL, за исключением Oracle.

И да - это много печатать - так SQL делает это.

marc_s
источник
4
Это не сработает в Oracle: docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Рафал
16
Здравствуй. Вы правы, но я просто хотел заявить, что это не будет работать на любом диалекте SQL.
Рафал
3
Работает на MySQL.
Жоао Фариас
19

Ваш запрос почти правильный. T-SQL для этого:

UPDATE  Table1
SET     Field1 = Table2.Field1,
        Field2 = Table2.Field2,
        other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID
Джон Ву
источник
Я подозреваю, что OP просто использовал псевдоним свободно, потому что вопрос не в правильности синтаксиса, а в том, «почему» этот синтаксис. Лично я предпочитаю использовать псевдонимы
везде,
17

Синтаксис

UPDATE table-name 
SET column-name = value, column-name = value, ...
WHERE condition

пример

UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6
Betrice MPalanzi
источник
8
   UPDATE t1 
    SET 
    t1.a = t2.a,
    t1.b = t2.b,
    .
    .
    .


    FROM 
    table1 t1 
    INNER JOIN table2 t2 ON  t1.id=t2.id

Вы можете попробовать это

Тангамани Паланисами
источник
4

Я пробовал таким образом, и он работает нормально:

UPDATE 
  Emp
SET 
  ID = 123, 
  Name = 'Peter' 
FROM 
  Table_Name
Питер
источник
Кажется, это работает нормально для моей установки PostgreSQL 12.2 (протестировано с использованием DBeaver).
Telmo Trooper
1

вот тот, который работает:

UPDATE  `table_1`
INNER JOIN 
 `table_2` SET  col1= value, col2= val,col3= val,col4= val;

значение столбца из таблицы_2

Драгос Кустура
источник
1

Если вам нужно набрать это несколько раз, вы можете сделать то же, что и я. Получите имена ваших столбцов в строках на листе Excel (запишите в конце названия каждого столбца (=), что легко в notepad ++) справа, создайте столбец для копирования и вставьте свое значение, которое будет соответствовать новым записям в каждый столбец. Затем справа от них в независимом столбце поставьте запятые, как задумано

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

Я не знаю более простого решения

Мохамед Бекхейт
источник
0

Я хотел бы поделиться с вами, как я решаю этот вопрос. Мой случай немного отличается, так как результат table2 является динамическим, и номера столбцов могут быть меньше, чем в table1. Но концепция та же самая.

Сначала получите результат table2.

введите описание изображения здесь

Далее открутите его.

введите описание изображения здесь

Затем напишите запрос на обновление, используя динамический SQL. Пример кода написан для тестирования 2 простых таблиц - tblA и tblB

--CREATE TABLE tblA(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
--CREATE TABLE tblB(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
--INSERT INTO tblA(id, col1, col2, col3, col4)
--VALUES(1,'A1','A2','A3','A4')
--INSERT INTO tblB(id, col1, col2, col3, col4)
--VALUES(1,'B1','B2','B3','B4')

DECLARE @id VARCHAR(10) = 1, @TSQL NVARCHAR(MAX)
DECLARE @tblPivot TABLE(    
    colName VARCHAR(255),
    val VARCHAR(255)
)

INSERT INTO @tblPivot
SELECT colName, val
FROM tblB
UNPIVOT
(
    val
    FOR colName IN (col1, col2, col3, col4)
) unpiv
WHERE id = @id

SELECT @TSQL = COALESCE(@TSQL + '''
,','') + colName + ' = ''' + val
FROM @tblPivot

SET @TSQL = N'UPDATE tblA
SET ' + @TSQL + ''' 
WHERE id = ' + @id
PRINT @TSQL
--EXEC SP_EXECUTESQL @TSQL

PRINT @TSQL результат:

введите описание изображения здесь

Вэйхуэй Го
источник
-3

Я сделал это в MySql, и он обновил несколько столбцов в одной записи, поэтому попробуйте это, если вы используете MySql в качестве сервера:

"UPDATE creditor_tb SET credit_amount='" & CDbl(cur_amount) & "'
                   , totalamount_to_pay='" & current_total & "',   
        WHERE credit_id='" & lbcreditId.Text & "'". 

Тем не менее, я программировал на vb.net, используя сервер MySql, но вы можете использовать его на своем любимом языке программирования, если вы используете MySql в качестве сервера.

Майкл Кисини
источник
-4
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

http://www.w3schools.com/sql/sql_update.asp

Меллад Каризада
источник
2
Это в значительной степени просто повторение существующих ответов.
Панг
-8
update T1
set T1.COST2=T1.TOT_COST+2.000,
T1.COST3=T1.TOT_COST+2.000,
T1.COST4=T1.TOT_COST+2.000,
T1.COST5=T1.TOT_COST+2.000,
T1.COST6=T1.TOT_COST+2.000,
T1.COST7=T1.TOT_COST+2.000,
T1.COST8=T1.TOT_COST+2.000,
T1.COST9=T1.TOT_COST+2.000,
T1.COST10=T1.TOT_COST+2.000,
T1.COST11=T1.TOT_COST+2.000,
T1.COST12=T1.TOT_COST+2.000,
T1.COST13=T1.TOT_COST+2.000
from DBRMAST T1 
inner join DBRMAST t2 on t2.CODE=T1.CODE
страсть оракула
источник
2
Пожалуйста, добавьте комментарий к своему ответу, чтобы объяснить, что он делает. На данный момент это помечено как некачественный ответ и будет удалено, если не будет улучшено.
Ян