SQL Server 2005에서 1개의 스테이트먼트에 2개의 테이블을 갱신하려면 어떻게 해야 합니다.
한 번에 두 개의 테이블을 업데이트하고 싶습니다.SQL Server 2005에서는 어떻게 하면 좋을까요?
UPDATE
Table1,
Table2
SET
Table1.LastName='DR. XXXXXX',
Table2.WAprrs='start,stop'
FROM
Table1 T1,
Table2 T2
WHERE
T1.id = T2.id
AND
T1.id = '010008'
하나의 스테이트먼트에서 여러 테이블을 업데이트할 수는 없지만 트랜잭션을 사용하여 두 개의 테이블이UPDATE
문장은 원자적으로 처리됩니다.또한 라운드 트립을 피하기 위해 배치도 할 수 있습니다.
BEGIN TRANSACTION;
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
COMMIT;
한 번에 두 개의 테이블을 업데이트할 수는 없지만 다음 명령을 사용하여 업데이트를 삽입할 수 있습니다.OUTPUT INTO
다음 출력을 두 번째 업데이트의 결합으로 사용할 수 있습니다.
DECLARE @ids TABLE (id int);
BEGIN TRANSACTION
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
OUTPUT INSERTED.id INTO @ids
WHERE Table1.field = '010008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table2
JOIN @ids i on i.id = Table2.id;
COMMIT;
나는 너의 예를 바꿨다.WHERE
다른 분야라는 조건id
만약 그렇다면id
이런 상상은 필요 없다OUTPUT
, 당신은 그냥 할 수 있습니다.UPDATE
같은 테이블 두 번째 테이블id='010008'
.
미안, 그럴 순 없어두 개의 다른 테이블에서 속성을 업데이트하려면 두 개의 개별 문을 실행해야 합니다.단, 일괄 처리(SQL 세트를 1회 왕복으로 서버로 전송)할 수 있습니다.
그것에 대한 짧은 대답은 "아니오"이다.에는 여러 테이블을 입력할 수 있지만from
update 스테이트먼트의 구. 테이블은 1개만 지정할 수 있습니다.update
키워드를 지정합니다."업데이트 가능" 보기(특정 제한을 따르는 보기일 뿐)를 작성하더라도 이러한 업데이트는 실패합니다.MSDN 문서의 관련 클립을 다음에 나타냅니다(강조사항은 제 것입니다).
table_or_view_name에서 참조하는 뷰는 갱신 가능해야 하며 뷰의 FROM 절에서 하나의 기본 테이블을 정확하게 참조해야 합니다.업데이트 가능한 보기에 대한 자세한 내용은 CREATE VIEW(Transact-SQL)를 참조하십시오.
다음 조건에 해당하는 경우 보기를 통해 기본 테이블의 데이터를 수정할 수 있습니다.
- UPDATE, INSERT 및 DELETE 문을 포함한 모든 수정 사항은 하나의 기본 테이블의 열만 참조해야 합니다.
- 뷰에서 수정되는 열은 테이블 열의 기본 데이터를 직접 참조해야 합니다.열은 다음과 같은 다른 방법으로 파생할 수 없습니다.
- 집계 함수:AVG, 카운트, SUM, MIN, MAX, 그룹화, STDEV, STDEVP, VAR 및 VARP.
- 계산.다른 열을 사용하는 식에서는 열을 계산할 수 없습니다.설정된 연산자 UNION, UNION ALL, CROSSJOIN, EXCEPT 및 CRESS를 사용하여 형성된 열은 계산에 포함되며 업데이트할 수도 없습니다.
- 수정되는 열은 GROUP BY, HAVING 또는 DISTING 절의 영향을 받지 않습니다.
- TOP은 뷰의 select_statement 어디에도 WITH CHECK OPTION 절과 함께 사용되지 않습니다.
단, 솔직히 말해서 LBushkin의 예와 같이 트랜잭션 내에서 두 개의 서로 다른 SQL 문을 사용하는 것을 고려해야 합니다.
업데이트: 업데이트 가능한 보기에서 여러 테이블을 업데이트할 수 있다는 내 원래 주장은 잘못되었습니다.SQL Server 2005 및 2012에서는 다음 오류가 발생합니다.저는 이것을 반영하여 답변을 수정했습니다.
Msg 4405, Level 16, State 1, Line 1
View or function 'updatable_view' is not updatable because the modification affects multiple base tables.
이것은 MySQL에서 작동하며 실제로는 암묵적인 트랜잭션일 뿐이지만 다음과 같습니다.
UPDATE Table1 t1, Table2 t2 SET
t2.field = t2.field+2,
t1.field = t1.field+2
WHERE t1.id = t2.foreign_id and t2.id = '123414'
복수의 스테이트먼트를 필요로 하는 복수의 테이블을 갱신하고 있는 경우는, 1개의 스테이트먼트를 갱신하고 있는 경우는, 다른 조건에 근거해 다른 테이블을 갱신할 필요가 있습니다.트먼트를 사용할 필요가 있습니다.
트랜잭션 내에 두 개의 업데이트 문을 배치해야 합니다.
1개의 테이블에 대해 update 문을 작성한 후 첫 번째 테이블 업데이트 시 트리거를 작성하여 두 번째 테이블을 업데이트할 수 있습니다.
표 2 특정 열을 기준으로 표 1 특정 열을 일반적으로 업데이트할 경우 이 쿼리는 완벽하게 작동합니다.
UPDATE table 1
SET Col 2 = t2.Col2,
Col 3 = t2.Col3
FROM table1 t1
INNER JOIN table 2 t2 ON t1.Col1 = t2.col1
제 관점에서는 SQL SERVER의 2개의 테이블을 1대 1로 갱신할 수 있습니다.
BEGIN TRANSACTION
DECLARE @CNSREQ VARCHAR(30)
DECLARE @ID INT
DECLARE @CNSRQDT VARCHAR(30)
DECLARE @ID2 INT
DECLARE @IDCNSREQ INT
DECLARE @FINALCNSREQ VARCHAR(30)
DECLARE @FINALCNSRQDT VARCHAR(30)
DECLARE @IDCNSRQDT INT
SET @CNSREQ=(SELECT MIN(REQUISICIONESDT.CNSREQ) FROM REQUISICIONESDT
INNER JOIN
REQUISICIONES
ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
AND REQUISICIONES.CNSREQ = REQUISICIONESDT.CNSREQ AND REQUISICIONESDT.IDREQ = REQUISICIONES.ID
WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID)
SELECT REQUISICIONES.CNSREQ, REQUISICIONES.ID, REQUISICIONES.CNSRQDT FROM REQUISICIONES
INNER JOIN
REQUISICIONESDT
ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
AND REQUISICIONES.CNSREQ = REQUISICIONESDT.CNSREQ AND REQUISICIONESDT.IDREQ = REQUISICIONES.ID
WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
AND REQUISICIONES.CNSREQ = @CNSREQ
UPDATE REQUISICIONESDT SET REQUISICIONESDT.CNSREQ=NULL, REQUISICIONESDT.IDREQ=NULL
FROM REQUISICIONES INNER JOIN REQUISICIONESDT
ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
AND REQUISICIONES.CNSREQ = @CNSREQ
UPDATE REQUISICIONES SET REQUISICIONES.CNSRQDT=NULL, REQUISICIONES.IDRQDT=NULL
FROM REQUISICIONES INNER JOIN REQUISICIONESDT
ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
AND REQUISICIONES.CNSREQ = @CNSREQ
SET @ID2=(SELECT MIN(REQUISICIONESDT.ID) FROM REQUISICIONESDT
WHERE ISNULL(REQUISICIONESDT.IDREQ,0)<>0)
DELETE FROM REQUISICIONESDT WHERE REQUISICIONESDT.ID=@ID2
SET @IDCNSREQ=(SELECT MIN (REQUISICIONES.ID)FROM REQUISICIONES
INNER JOIN REQUISICIONESDT ON
REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)
SET @FINALCNSREQ=(SELECT MIN (REQUISICIONES.CNSREQ)FROM REQUISICIONES
INNER JOIN REQUISICIONESDT ON
REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)
SET @FINALCNSRQDT=(SELECT MIN(REQUISICIONESDT.CNSRQDT) FROM REQUISICIONES
INNER JOIN REQUISICIONESDT ON
REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)
SET @IDCNSRQDT=(SELECT MIN (REQUISICIONESDT.ID)FROM REQUISICIONES
INNER JOIN REQUISICIONESDT ON
REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)
UPDATE REQUISICIONES SET REQUISICIONES.CNSRQDT = @FINALCNSRQDT, REQUISICIONES.IDRQDT=@IDCNSRQDT FROM REQUISICIONES
INNER JOIN REQUISICIONESDT ON
REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
WHERE REQUISICIONESDT.CNSRQDT = @FINALCNSRQDT AND REQUISICIONESDT.ID = @IDCNSRQDT
ROLLBACK TRANSACTION
이 쿼리는 다음과 같이 간단합니다.
UPDATE
Table1 T1 join Table2 T2 on T1.id = T2.id
SET
T1.LastName='DR. XXXXXX',
T2.WAprrs='start,stop'
WHERE
T1.id = '010008'
언급URL : https://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005
'programing' 카테고리의 다른 글
서버와의 접속은 정상적으로 확립되었지만 로그인 전 핸드쉐이크 중 오류가 발생하였습니다. (0) | 2023.04.07 |
---|---|
Microsoft SQL Server 2005에서 group_concat MySQL 함수를 시뮬레이션하고 있습니까? (0) | 2023.04.07 |
클래스의 모든 속성을 루프하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
SQL Server VARCHAR/NVARCHAR 문자열에 줄 바꿈을 삽입하는 방법 (0) | 2023.04.07 |
SQL Server 2008에서 테이블 에일리어스를 사용하여 UPDATE SQL을 작성하는 방법 (0) | 2023.04.07 |