복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.죄송합니다, AFAIK, 당신은 할 수 없습니다. 두 개의 서로 다른 테이블의 속성을 업데이트하려면 두 개의 문을 실행해야합니다. 그러나이 일괄 적으로 할 수 있습니다 (SQL의 세트는 하나 왕복 서버로 전송)

    죄송합니다, AFAIK, 당신은 할 수 없습니다. 두 개의 서로 다른 테이블의 속성을 업데이트하려면 두 개의 문을 실행해야합니다. 그러나이 일괄 적으로 할 수 있습니다 (SQL의 세트는 하나 왕복 서버로 전송)

  4. ==============================

    4.그에게 짧은 대답은 no입니다. 당신이 업데이트 문의 FROM 절에서 여러 테이블을 입력 할 수 있지만, 당신은 단지 업데이트 키워드 다음에 하나의 테이블을 지정할 수 있습니다. 당신이 (특정 제한을 다음 뷰는 단순히 인)는 "갱신"보기를 작성하더라도,이 같은 업데이트가 실패합니다. 다음은 MSDN 문서에서 관련 클립 (강조는 나의 것)입니다.

    그에게 짧은 대답은 no입니다. 당신이 업데이트 문의 FROM 절에서 여러 테이블을 입력 할 수 있지만, 당신은 단지 업데이트 키워드 다음에 하나의 테이블을 지정할 수 있습니다. 당신이 (특정 제한을 다음 뷰는 단순히 인)는 "갱신"보기를 작성하더라도,이 같은 업데이트가 실패합니다. 다음은 MSDN 문서에서 관련 클립 (강조는 나의 것)입니다.

    UPDATE (Transact-SQL)를 참조하십시오

    VIEW 만들기 (Transact-SQL)

    모든 정직에서,하지만 당신은 LBushkin의 예에 따라 트랜잭션 내에서 두 개의 서로 다른 SQL 문을 사용하는 것이 좋습니다.

    업데이트 : 당신이 갱신 가능한 뷰에 여러 테이블을 업데이트 할 수 있음을 내 원래의 주장은 틀렸다. SQL 서버 2005 및 2012, 다음과 같은 오류가 발생합니다. 나는 이것을 반영하기 위해 내 대답을 정정했다.

  5. ==============================

    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. ==============================

    6.당신은 트랜잭션 내부에 두 개의 업데이트 문을 배치해야

    당신은 트랜잭션 내부에 두 개의 업데이트 문을 배치해야

  7. ==============================

    7.그런 다음 하나 개의 테이블과 첫 번째 테이블의 업데이트에 대한 트리거, 업데이트 두 번째 테이블에 대해 UPDATE 문을 쓸 수 있습니다

    그런 다음 하나 개의 테이블과 첫 번째 테이블의 업데이트에 대한 트리거, 업데이트 두 번째 테이블에 대해 UPDATE 문을 쓸 수 있습니다

  8. ==============================

    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. ==============================

    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'
    
  10. 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