복붙노트

[SQL] 어떻게 업데이트는 SQL Server에서 SELECT에서합니까?

SQL

어떻게 업데이트는 SQL Server에서 SELECT에서합니까?

SQL 서버에서는 SELECT 문을 사용하여 테이블에 삽입하는 것이 가능하다 :

INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3 
FROM other_table 
WHERE sql = 'cool'

그것은 SELECT를 통해 업데이트 할 수도 있습니까? 나는 값을 포함하는 임시 테이블을 가지고 있고 그 값을 사용하여 다른 테이블을 업데이트하고 싶습니다. 이 같은 아마 뭔가 :

UPDATE Table SET col1, col2
SELECT col1, col2 
FROM other_table 
WHERE sql = 'cool'
WHERE Table.id = other_table.id

해결법

  1. ==============================

    1.

    UPDATE
        Table_A
    SET
        Table_A.col1 = Table_B.col1,
        Table_A.col2 = Table_B.col2
    FROM
        Some_Table AS Table_A
        INNER JOIN Other_Table AS Table_B
            ON Table_A.id = Table_B.id
    WHERE
        Table_A.col3 = 'cool'
    
  2. ==============================

    2.(더 이상)에서 SQL 서버 2008을 사용 MERGE

    (더 이상)에서 SQL 서버 2008을 사용 MERGE

    MERGE INTO YourTable T
       USING other_table S 
          ON T.id = S.id
             AND S.tsql = 'cool'
    WHEN MATCHED THEN
       UPDATE 
          SET col1 = S.col1, 
              col2 = S.col2;
    

    또한 :

    MERGE INTO YourTable T
       USING (
              SELECT id, col1, col2 
                FROM other_table 
               WHERE tsql = 'cool'
             ) S
          ON T.id = S.id
    WHEN MATCHED THEN
       UPDATE 
          SET col1 = S.col1, 
              col2 = S.col2;
    
  3. ==============================

    3.

    UPDATE YourTable 
    SET Col1 = OtherTable.Col1, 
        Col2 = OtherTable.Col2 
    FROM (
        SELECT ID, Col1, Col2 
        FROM other_table) AS OtherTable
    WHERE 
        OtherTable.ID = YourTable.ID
    
  4. ==============================

    4.나는 다음에 로빈의 훌륭한 대답을 수정할 것입니다 :

    나는 다음에 로빈의 훌륭한 대답을 수정할 것입니다 :

    UPDATE Table
    SET Table.col1 = other_table.col1,
     Table.col2 = other_table.col2
    FROM
        Table
    INNER JOIN other_table ON Table.id = other_table.id
    WHERE
        Table.col1 != other_table.col1
    OR Table.col2 != other_table.col2
    OR (
        other_table.col1 IS NOT NULL
        AND Table.col1 IS NULL
    )
    OR (
        other_table.col2 IS NOT NULL
        AND Table.col2 IS NULL
    )
    

    WHERE 절을하지 않고, 당신도 영향을받을 필요가 없습니다 행, 정말 해고하지 말았어야 수 (아마도) 원인 인덱스 재 계산 화재 트리거에 영향을 미칠 수 있습니다.

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

    5.일방 통행

    일방 통행

    UPDATE t 
    SET t.col1 = o.col1, 
        t.col2 = o.col2
    FROM 
        other_table o 
      JOIN 
        t ON t.id = o.id
    WHERE 
        o.sql = 'cool'
    
  6. ==============================

    6.아직 언급되지 않은 또 다른 가능성은 단지 CTE에 SELECT 문 자체를 척하고 CTE를 업데이트하는 것입니다.

    아직 언급되지 않은 또 다른 가능성은 단지 CTE에 SELECT 문 자체를 척하고 CTE를 업데이트하는 것입니다.

    ;WITH CTE
         AS (SELECT T1.Col1,
                    T2.Col1 AS _Col1,
                    T1.Col2,
                    T2.Col2 AS _Col2
             FROM   T1
                    JOIN T2
                      ON T1.id = T2.id
             /*Where clause added to exclude rows that are the same in both tables
               Handles NULL values correctly*/
             WHERE EXISTS(SELECT T1.Col1,
                                 T1.Col2
                           EXCEPT
                           SELECT T2.Col1,
                                  T2.Col2))
    UPDATE CTE
    SET    Col1 = _Col1,
           Col2 = _Col2
    

    결과를 확인 정신에 자신의 첫번째에 SELECT 문을 실행하기 쉽다는 장점을 가지고 있지만 않습니다 그들이 소스 및 목표 테이블에서 같은 이름 경우 위와 같이 별칭에 열을 당신이 필요합니다.

    이것은 또한 다른 답변 네에 도시 된 구문 FROM 독점 UPDATE와 같은 제한 ... 갖는다. 소스 테이블이 일대의 여러 측면에있는 경우는 (업데이트에 사용되는 가능한 매칭되는 합류 기록 결정적 (undeterministic)이며 다음 조인되는 문제에 대한 시도가있는 경우 오류를 제기하여 MERGE를 피합니다 ) 두 번 이상 같은 행을 업데이트합니다.

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

    7.기록 (그리고했다 I와 같은 검색 등)의 경우는 다음과 같이 MySQL의에서 그것을 할 수 있습니다 :

    기록 (그리고했다 I와 같은 검색 등)의 경우는 다음과 같이 MySQL의에서 그것을 할 수 있습니다 :

    UPDATE first_table, second_table
    SET first_table.color = second_table.color
    WHERE first_table.id = second_table.foreign_id
    
  8. ==============================

    8.별칭을 사용 :

    별칭을 사용 :

    UPDATE t
       SET t.col1 = o.col1
      FROM table1 AS t
             INNER JOIN 
           table2 AS o 
             ON t.id = o.id
    
  9. ==============================

    9.그것을 할 수있는 간단한 방법은 다음과 같습니다

    그것을 할 수있는 간단한 방법은 다음과 같습니다

    UPDATE
        table_to_update,
        table_info
    SET
        table_to_update.col1 = table_info.col1,
        table_to_update.col2 = table_info.col2
    
    WHERE
        table_to_update.ID = table_info.ID
    
  10. ==============================

    10.이것은 (예를 들어, 주로 절차에 사용) 업데이트를 수행 할 수있는 틈새 이유가 될 수도 있고, 다른 사람에게 명백한 수 있지만, 그것은 또한 당신이 사용하지 않고 갱신-SELECT 문을 수행 케이스에 (에 가입 할 수 있음을 명시해야 테이블에는 공통 필드가없는 사이에있는 거 업데이트).

    이것은 (예를 들어, 주로 절차에 사용) 업데이트를 수행 할 수있는 틈새 이유가 될 수도 있고, 다른 사람에게 명백한 수 있지만, 그것은 또한 당신이 사용하지 않고 갱신-SELECT 문을 수행 케이스에 (에 가입 할 수 있음을 명시해야 테이블에는 공통 필드가없는 사이에있는 거 업데이트).

    update
        Table
    set
        Table.example = a.value
    from
        TableExample a
    where
        Table.field = *key value* -- finds the row in Table 
        AND a.field = *key value* -- finds the row in TableExample a
    
  11. ==============================

    11.여기에 또 다른 유용한 구문은 다음과 같습니다

    여기에 또 다른 유용한 구문은 다음과 같습니다

    UPDATE suppliers
    SET supplier_name = (SELECT customers.name
                         FROM customers
                         WHERE customers.customer_id = suppliers.supplier_id)
    WHERE EXISTS (SELECT customers.name
                  FROM customers
                  WHERE customers.customer_id = suppliers.supplier_id);
    

    null의 여부 "WHERE 존재"사용하여 경우는 확인합니다.

  12. ==============================

    12.대신 SQL 서버의 MySQL을 사용하는 경우, 구문은 다음과 같습니다

    대신 SQL 서버의 MySQL을 사용하는 경우, 구문은 다음과 같습니다

    UPDATE Table1
    INNER JOIN Table2
    ON Table1.id = Table2.id
    SET Table1.col1 = Table2.col1,
        Table1.col2 = Table2.col2
    
  13. ==============================

    13.이 업데이트를 수행하기 전에 업데이트됩니다을 확인할 수 있도록 그것을 쓸 수있는 빠른 방법을 볼 수 있도록 나는 단지이를 추가합니다.

    이 업데이트를 수행하기 전에 업데이트됩니다을 확인할 수 있도록 그것을 쓸 수있는 빠른 방법을 볼 수 있도록 나는 단지이를 추가합니다.

    UPDATE Table 
    SET  Table.col1 = other_table.col1,
         Table.col2 = other_table.col2 
    --select Table.col1, other_table.col,Table.col2,other_table.col2, *   
    FROM     Table 
    INNER JOIN     other_table 
        ON     Table.id = other_table.id 
    
  14. ==============================

    14.SELECT에서 INNER와 UPDATE는 SQL 데이터베이스에 가입하세요

    SELECT에서 INNER와 UPDATE는 SQL 데이터베이스에 가입하세요

    가장 많이있는이 게시물의 너무 많은 답장,이 때문에 내가 너무 여기에 내 제안을 제공 할 것이라고 생각까지 - 투표했다. 질문은 매우 흥미로운이지만, 나는 많은 포럼 사이트에서 볼 수 및 INNER 스크린 샷으로 가입하여 솔루션을 만들었습니다.

    처음에는 테이블 schoolold로 이름과 열 이름에 대한 몇 가지 기록을 삽입하고 실행을 만들었습니다.

    그럼 내가 삽입 된 레코드를 볼 SELECT 명령을 실행.

    그럼 난 schoolnew 유사 그것은에 대한 작업 위의 실행과 함께라는 새 테이블을 만들었습니다.

    그런 다음, 거기에보기 삽입 된 기록에, 나는 SELECT 명령을 실행합니다.

    자, 여기가 내가 가입 INNER와 UPDATE 명령을 실행,이 작업을 완료하는 데, 세 번째와 네 번째 행의 일부 내용을 변경하고자합니다.

    변경 내용을 보려면 나는 SELECT 명령을 실행합니다.

    당신은 테이블 schoolold의 세 번째와 네 번째 기록을 쉽게 INNER이 UPDATE 문으로 가입 사용하여 테이블 schoolnew로 대체하는 방법을 볼 수 있습니다.

  15. ==============================

    15.그리고 당신은 (너무 자주 발생하지 것이다) 자체와 테이블에 가입하기를 원한다면 :

    그리고 당신은 (너무 자주 발생하지 것이다) 자체와 테이블에 가입하기를 원한다면 :

    update t1                    -- just reference table alias here
    set t1.somevalue = t2.somevalue
    from table1 t1               -- these rows will be the targets
    inner join table1 t2         -- these rows will be used as source
    on ..................        -- the join clause is whatever suits you
    
  16. ==============================

    16.다음 예는 추가 업데이트에 대한 이전 및 새 값을 반환하는 파생 테이블, FROM 절 후 SELECT 문을 사용합니다 :

    다음 예는 추가 업데이트에 대한 이전 및 새 값을 반환하는 파생 테이블, FROM 절 후 SELECT 문을 사용합니다 :

    UPDATE x
    SET    x.col1 = x.newCol1,
           x.col2 = x.newCol2
    FROM   (SELECT t.col1,
                   t2.col1 AS newCol1,
                   t.col2,
                   t2.col2 AS newCol2
            FROM   [table] t
                   JOIN other_table t2
                     ON t.ID = t2.ID) x
    
  17. ==============================

    17.CTE를 통해 업데이트는 여기에 다른 답변보다 더 많은 읽을 수 있습니다 :

    CTE를 통해 업데이트는 여기에 다른 답변보다 더 많은 읽을 수 있습니다 :

    ;WITH cte
         AS (SELECT col1,col2,id
             FROM   other_table
             WHERE  sql = 'cool')
    UPDATE A
    SET    A.col1 = B.col1,
           A.col2 = B.col2
    FROM   table A
           INNER JOIN cte B
                   ON A.id = B.id
    
  18. ==============================

    18.SQL Server를 사용하는 경우는 조인을 지정하지 않고 서로 하나 개의 테이블을 업데이트하고 단순히 where 절에서이 둘을 연결할 수 있습니다. 이것은 매우 간단한 SQL 쿼리를 만드는 :

    SQL Server를 사용하는 경우는 조인을 지정하지 않고 서로 하나 개의 테이블을 업데이트하고 단순히 where 절에서이 둘을 연결할 수 있습니다. 이것은 매우 간단한 SQL 쿼리를 만드는 :

    UPDATE Table1
    SET Table1.col1 = Table2.col1,
        Table1.col2 = Table2.col2
    FROM
        Table2
    WHERE
        Table1.id = Table2.id
    
  19. ==============================

    19.모든 통합 다른 여기에 접근한다.

    모든 통합 다른 여기에 접근한다.

    샘플 테이블 구조는 다음과 Product_BAK에서 ​​제품 테이블에 업데이트됩니다.

    CREATE TABLE [dbo].[Product](
        [Id] [int] IDENTITY(1, 1) NOT NULL,
        [Name] [nvarchar](100) NOT NULL,
        [Description] [nvarchar](100) NULL
    ) ON [PRIMARY]
    
        CREATE TABLE [dbo].[Product_BAK](
            [Id] [int] IDENTITY(1, 1) NOT NULL,
            [Name] [nvarchar](100) NOT NULL,
            [Description] [nvarchar](100) NULL
        ) ON [PRIMARY]
    
        update P1
        set Name = P2.Name
        from Product P1
        inner join Product_Bak P2 on p1.id = P2.id
        where p1.id = 2
    
        ; With CTE as
        (
            select id, name from Product_Bak where id = 2
        )
        update P
        set Name = P2.name
        from  product P  inner join CTE P2 on P.id = P2.id
        where P2.id = 2
    
        Merge into product P1
        using Product_Bak P2 on P1.id = P2.id
    
        when matched then
        update set p1.[description] = p2.[description], p1.name = P2.Name;
    

    대상에 일치하는 레코드를 찾지 못하는 경우이 병합 성명에서, 우리는 삽입 할 수 있지만 소스에 존재 구문을 발견하십시오

        Merge into product P1
        using Product_Bak P2 on P1.id = P2.id;
    
        when matched then
        update set p1.[description] = p2.[description], p1.name = P2.Name;
    
        WHEN NOT MATCHED THEN
        insert (name, description)
        values(p2.name, P2.description);
    
  20. ==============================

    20.다른 방법은 파생 테이블을 사용하는 것입니다 :

    다른 방법은 파생 테이블을 사용하는 것입니다 :

    UPDATE t
    SET t.col1 = a.col1
        ,t.col2 = a.col2
    FROM (
    SELECT id, col1, col2 FROM @tbl2) a
    INNER JOIN @tbl1 t ON t.id = a.id
    

    샘플 데이터

    DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
    DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
    
    INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c'
    
    INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4'
    
    UPDATE t
    SET t.col1 = a.col1
        ,t.col2 = a.col2
    FROM (
    SELECT id, col1, col2 FROM @tbl2) a
    INNER JOIN @tbl1 t ON t.id = a.id
    
    SELECT * FROM @tbl1
    SELECT * FROM @tbl2
    
  21. ==============================

    21.

    UPDATE TQ
    SET TQ.IsProcessed = 1, TQ.TextName = 'bla bla bla'
    FROM TableQueue TQ
    INNER JOIN TableComment TC ON TC.ID = TQ.TCID
    WHERE TQ.IsProcessed = 0
    

    당신이 당신이 원하는 업데이트하는하려면 먼저 선택

    SELECT TQ.IsProcessed, 1 AS NewValue1, TQ.TextName, 'bla bla bla' AS NewValue2
    FROM TableQueue TQ
    INNER JOIN TableComment TC ON TC.ID = TQ.TCID
    WHERE TQ.IsProcessed = 0
    
  22. ==============================

    22.이 경우에도 짧은 방법이며 그것은 당신을 위해 놀라운 일이 될 수 있습니다

    이 경우에도 짧은 방법이며 그것은 당신을 위해 놀라운 일이 될 수 있습니다

    샘플 데이터 세트 :

    CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10));
    CREATE TABLE #DEST   ([ID] INT, [Desc] VARCHAR(10));
    
    INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3');
    INSERT INTO #DEST   VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');
    

    암호:

    UPDATE #DEST
    SET #DEST.[Desc] = #SOURCE.[Desc]
    FROM #SOURCE
    WHERE #DEST.[ID] = #SOURCE.[ID];
    
  23. ==============================

    23.사용하다:

    사용하다:

    drop table uno
    drop table dos
    
    create table uno
    (
        uid int,
        col1 char(1),
        col2 char(2)
    )
    create table dos
    (
        did int,
        col1 char(1),
        col2 char(2),
        [sql] char(4)
    )
    insert into uno(uid) values (1)
    insert into uno(uid) values (2)
    insert into dos values (1,'a','b',null)
    insert into dos values (2,'c','d','cool')
    
    select * from uno 
    select * from dos
    

    어느 한 쪽:

    update uno set col1 = (select col1 from dos where uid = did and [sql]='cool'), 
    col2 = (select col2 from dos where uid = did and [sql]='cool')
    

    또는:

    update uno set col1=d.col1,col2=d.col2 from uno 
    inner join dos d on uid=did where [sql]='cool'
    
    select * from uno 
    select * from dos
    

    ID 열에 이름이 두 테이블에서 동일한 경우, 단지 테이블의 업데이트가되기 전에 테이블 이름을 넣어 즉 ​​선택한 테이블, 별칭을 사용 :

    update uno set col1 = (select col1 from dos d where uno.[id] = d.[id] and [sql]='cool'),
    col2  = (select col2 from dos d where uno.[id] = d.[id] and [sql]='cool')
    
  24. ==============================

    24.허용 대답에서, 후 :

    허용 대답에서, 후 :

    SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
    

    나는 추가합니다 :

    OUTPUT deleted.*, inserted.*
    

    내가 일어날 모든 것을보고 이런 식으로 : 내가 주로하는 일은 롤 백업 거래에서 최선을 다하는하고 "OUTPUT"를 사용하고 있습니다. 내가 무엇을보고 행복 해요 때, 나는 COMMIT로 롤백을 변경합니다.

    나는 스크립트와 OUTPUT 결과 모두 저장 롤 백업 쿼리 및 I을 실행할 때 옵션 "텍스트로 결과"를 사용 그래서 나는 보통, 내가 무슨 짓을 문서화해야합니다. (물론 이것은 내가 너무 많은 행을 변경 한 경우 실용적이지 않습니다)

  25. ==============================

    25.아래의 솔루션은 MySQL 데이터베이스 작동 :

    아래의 솔루션은 MySQL 데이터베이스 작동 :

    UPDATE table1 a , table2 b 
    SET a.columname = 'some value' 
    WHERE b.columnname IS NULL ;
    
  26. ==============================

    26.select 문에서 업데이트 할 다른 방법 :

    select 문에서 업데이트 할 다른 방법 :

    UPDATE A
    SET A.col = A.col,B.col1 = B.col1
    FROM  first_Table AS A
    INNER JOIN second_Table AS B  ON A.id = B.id WHERE A.col2 = 'cool'
    
  27. ==============================

    27.

    UPDATE table AS a
    INNER JOIN table2 AS b
    ON a.col1 = b.col1
    INNER JOIN ... AS ...
    ON ... = ...
    SET ...
    WHERE ...
    
  28. ==============================

    28.옵션 1 : 내부를 사용하여 가입 :

    옵션 1 : 내부를 사용하여 가입 :

    UPDATE
        A
    SET
        A.col1 = B.col1,
        A.col2 = B.col2
    FROM
        Some_Table AS A
        INNER JOIN Other_Table AS B
            ON A.id = B.id
    WHERE
        A.col3 = 'cool'
    

    옵션 2 : 상관 하위 쿼리

    UPDATE table 
    SET Col1 = B.Col1, 
        Col2 = B.Col2 
    FROM (
        SELECT ID, Col1, Col2 
        FROM other_table) B
    WHERE 
        B.ID = table.ID
    
  29. ==============================

    29.

    UPDATE table1
    SET column1 = (SELECT expression1
                   FROM table2
                   WHERE conditions)
    [WHERE conditions];
    

    SQL 서버에서 다른 테이블에서 데이터를 하나 개의 테이블을 업데이트하는 UPDATE 문에 대한 구문

  30. ==============================

    30.당신은 SQL 서버 업데이트를 위해이에서 사용할 수 있습니다

    당신은 SQL 서버 업데이트를 위해이에서 사용할 수 있습니다

    UPDATE
        T1
    SET
       T1.col1 = T2.col1,
       T1.col2 = T2.col2
    FROM
       Table1 AS T1
    INNER JOIN Table2 AS T2
        ON T1.id = T2.id
    WHERE
        T1.col3 = 'cool'
    
  31. from https://stackoverflow.com/questions/2334712/how-do-i-update-from-a-select-in-sql-server by cc-by-sa and MIT license