[SQL] 어떻게 2005 SQL 서버에 하나 개의 문장에서 두 테이블을 업데이트?
SQL어떻게 2005 SQL 서버에 하나 개의 문장에서 두 테이블을 업데이트?
나는 한 번에 두 개의 테이블을 업데이트합니다. 나는 2005 SQL 서버에서 어떻게 그렇게합니까?
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'
해결법
-
==============================
1.당신은 그러나, 두 개의 UPDATE 문을 원자 적으로 처리되어 있는지 확인하기 위해 트랜잭션을 사용할 수 있습니다, 하나의 문에 여러 테이블을 업데이트 할 수 없습니다. 또한 일괄 그들에게 왕복을 피하기 위해 수 있습니다.
당신은 그러나, 두 개의 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;
-
==============================
2.한 번에 두 개의 테이블을 업데이트 할 수 없습니다,하지만 당신은 출력 INTO를 사용하여 삽입으로 업데이 트를 연결할 수 있으며, 두 번째 업데이트를 위해 가입으로이 출력을 사용할 수 있습니다 :
한 번에 두 개의 테이블을 업데이트 할 수 없습니다,하지만 당신은 출력 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;
나는 조건이 ID 이외에 다른 필드가 될 귀하의 예제를 변경했습니다. 그것의 ID가이 멋진 출력이 필요하지 않은 경우, 당신은 단지 동일한 ID = '010008'에 대한 두 번째 테이블을 업데이트 할 수 있습니다.
-
==============================
3.죄송합니다, AFAIK, 당신은 할 수 없습니다. 두 개의 서로 다른 테이블의 속성을 업데이트하려면 두 개의 문을 실행해야합니다. 그러나이 일괄 적으로 할 수 있습니다 (SQL의 세트는 하나 왕복 서버로 전송)
죄송합니다, AFAIK, 당신은 할 수 없습니다. 두 개의 서로 다른 테이블의 속성을 업데이트하려면 두 개의 문을 실행해야합니다. 그러나이 일괄 적으로 할 수 있습니다 (SQL의 세트는 하나 왕복 서버로 전송)
-
==============================
4.그에게 짧은 대답은 no입니다. 당신이 업데이트 문의 FROM 절에서 여러 테이블을 입력 할 수 있지만, 당신은 단지 업데이트 키워드 다음에 하나의 테이블을 지정할 수 있습니다. 당신이 (특정 제한을 다음 뷰는 단순히 인)는 "갱신"보기를 작성하더라도,이 같은 업데이트가 실패합니다. 다음은 MSDN 문서에서 관련 클립 (강조는 나의 것)입니다.
그에게 짧은 대답은 no입니다. 당신이 업데이트 문의 FROM 절에서 여러 테이블을 입력 할 수 있지만, 당신은 단지 업데이트 키워드 다음에 하나의 테이블을 지정할 수 있습니다. 당신이 (특정 제한을 다음 뷰는 단순히 인)는 "갱신"보기를 작성하더라도,이 같은 업데이트가 실패합니다. 다음은 MSDN 문서에서 관련 클립 (강조는 나의 것)입니다.
UPDATE (Transact-SQL)를 참조하십시오
VIEW 만들기 (Transact-SQL)
모든 정직에서,하지만 당신은 LBushkin의 예에 따라 트랜잭션 내에서 두 개의 서로 다른 SQL 문을 사용하는 것이 좋습니다.
업데이트 : 당신이 갱신 가능한 뷰에 여러 테이블을 업데이트 할 수 있음을 내 원래의 주장은 틀렸다. SQL 서버 2005 및 2012, 다음과 같은 오류가 발생합니다. 나는 이것을 반영하기 위해 내 대답을 정정했다.
-
==============================
5.이 MySQL을 위해 일하는 정말 그냥 암시 적 트랜잭션이지만 이런 일을 가야한다 :
이 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'
당신이 다음 다른 다른 조건을 기반으로 한 업데이트 할 경우 당신은 가능성이 할 수있는 ... 멀티 문을 필요로 다중 테이블에 대한 업데이트를하고 있다면 ... 당신은 트랜잭션을 사용해야합니다.
-
==============================
6.당신은 트랜잭션 내부에 두 개의 업데이트 문을 배치해야
당신은 트랜잭션 내부에 두 개의 업데이트 문을 배치해야
-
==============================
7.그런 다음 하나 개의 테이블과 첫 번째 테이블의 업데이트에 대한 트리거, 업데이트 두 번째 테이블에 대해 UPDATE 문을 쓸 수 있습니다
그런 다음 하나 개의 테이블과 첫 번째 테이블의 업데이트에 대한 트리거, 업데이트 두 번째 테이블에 대해 UPDATE 문을 쓸 수 있습니다
-
==============================
8.내 관점에서 당신은 SQL Server의 두 테이블 중 하나의 업데이트에 그 일을 수행 할 수 있습니다 :
내 관점에서 당신은 SQL Server의 두 테이블 중 하나의 업데이트에 그 일을 수행 할 수 있습니다 :
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
-
==============================
9.이 쿼리는 다음과 같이 그것은 간단하다.
이 쿼리는 다음과 같이 그것은 간단하다.
UPDATE Table1 T1 join Table2 T2 on T1.id = T2.id SET T1.LastName='DR. XXXXXX', T2.WAprrs='start,stop' WHERE T1.id = '010008'
from https://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL은 행에서 여러 테이블 대에 가입 왼쪽? (0) | 2020.03.11 |
---|---|
[SQL] java.sql.Date 대 java.util.Date (0) | 2020.03.11 |
[SQL] 선택 열에 대 선택 * (0) | 2020.03.11 |
[SQL] MySQL의와 계산의 중간에 간단한 방법 (0) | 2020.03.11 |
[SQL] 엄격한 관계 모델 전자 상거래 대 법인 속성 값 데이터베이스 (0) | 2020.03.11 |