SQL에서 여러 열 업데이트


166

insert 문을 사용하는 것과 같은 방식으로 SQL Server에서 여러 열을 업데이트하는 방법이 있습니까?

다음과 같은 것 :

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의 편집기를 사용하여 쿼리를 작성하지 않고 행에 직접 데이터를 입력하십시오.
Dan Bechard

답변:


89

"열심 한 방법"은 표준 SQL이며 주류 RDBMS가 수행하는 방법입니다.

100 개 이상의 열을 사용하면 디자인 문제가 발생할 가능성이 높습니다. 또한 클라이언트 도구 (예 : UPDATE 문 생성) 또는 ORM을 사용하여 완화 방법이 있습니다.


5
MSSQL에서 다른 방법이 없습니까?
Joe

4
@ 조 : 아니오. 아래 Alex K의 답변을 참조하십시오 ( stackoverflow.com/a/9079904/27535 ), MS에게 추가 요청
gbn

내가 사용하는 생각 1keydata.com/sql/sqlupdate.html "SET의 column_1 = [값 1], column_2 = [값]"
DELE

다시 동의하십시오. 일반적으로 디자인 문제가 있지만 대량 유효성 검사 / 데이터 정리가 필요한 상황이 있습니다. 나는 현재 그렇게하고 있으며 SQL Server 2012에서 이제 @John Woo 답변 당 하나 이상의 열을 업데이트 할 수 있습니다.
힐러리

201

이 시도:

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

Oracle을 제외한 대부분의 SQL 방언에서 작동합니다.

그리고 그렇습니다-많은 타이핑이 있습니다-SQL 이하는 방식입니다.


4
이것은 오라클에서 작동하지 않습니다 : docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html
Rafał

16
안녕하세요. 당신 말이 맞습니다. 그러나 나는 그것이 SQL 언어에서 작동하지 않는다고 말하고 싶었습니다.
Rafał

3
MySQL에서 작동합니다.
João Farias


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
gbn

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

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;

value는 table_2의 열입니다.


1

이것을 여러 번 다시 입력해야하는 경우 한 번 수행 한 것처럼 수행 할 수 있습니다. 열의 이름을 Excel 시트의 행으로 가져 오십시오 (오른쪽의 메모장 열에서 쉬운 각 열 이름 (=) 끝에 적어 두십시오)은 새 항목에 해당하는 값을 복사하여 붙여 넣습니다. 각 열. 그런 다음 독립 열에서 오른쪽에 디자인대로 쉼표를 넣으십시오.

그런 다음 매번 값을 중간 열에 복사 한 다음 붙여 넣기 한 다음 실행해야합니다.

나는 더 쉬운 해결책을 모른다


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 & "'". 

그러나 MySql 서버를 사용하여 vb.net에서 코딩하고 있지만 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
답변에 해설을 추가하여 답변 내용을 설명하십시오. 현재 이는 품질이 낮은 답변으로 표시되며 개선하지 않으면 삭제됩니다.
Ian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.