Оновіть декілька стовпців у 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+ стовпців.


це звучить досить
схильно

Якщо ви робите це програмно, використовуйте параметризовані запити, і вам доведеться писати їх лише один раз. Якщо ви робите це вручну, скористайтеся редактором SQL Management Studio і введіть дані безпосередньо в рядок, а не писати запит.
Ден Бешард

Відповіді:


89

"Стомлюючий спосіб" - це стандартний SQL і те, як це роблять основні RDBMS.

З 100+ стовпцями у вас, швидше за все, виникають проблеми з дизайном ... також існують методи пом'якшення в клієнтських інструментах (наприклад, генерації UPDATE висловлювань) або за допомогою ORM


5
Тож немає іншого способу зробити це в MSSQL?
Джо

4
@Joe: ні. Дивіться відповідь від Alex K нижче ( 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
Rafał

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 просто використовував псевдонім вільно, тому що питання не в правильності синтаксису, а в тому, "чому" цей синтаксис. Особисто я вважаю за краще використовувати псевдоніми в протягом , як я зробив тут: stackoverflow.com/a/982947/27535
ГБН

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 (запишіть в кінці кожного стовпця ім'я (=), що легко в блокноті ++), на правій стороні створіть стовпець, щоб скопіювати та вставити значення, яке буде відповідати новим записам на кожен стовпчик. Потім праворуч від них у незалежну колонку ставлять коми, як було задумано

Тоді вам доведеться кожного разу копіювати свої значення у середній стовпчик, а потім просто вставити та запустити

Я не знаю простішого рішення


0

Я хотів би поділитися з вами тим, як я вирішую подібне питання. Мій випадок дещо відрізняється, оскільки результат table2 є динамічним, а номери стовпців можуть бути меншими, ніж у таблиці1. Але концепція однакова.

Спочатку отримайте результат таблиці2.

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

Далі зніміть його.

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

Потім запишіть запит на оновлення, використовуючи динамічний 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.