Обновить несколько столбцов в 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 делает это.


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


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 в качестве сервера.



-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
Пожалуйста, добавьте комментарий к своему ответу, чтобы объяснить, что он делает. На данный момент это помечено как некачественный ответ и будет удалено, если не будет улучшено.
Ян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.