sql-server where - SQL Server의 SELECT에서 어떻게 업데이트합니까?





clause sqlserver (26)


SQL Server에서이 업데이트를 사용할 수 있습니다.

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'

SQL Server 에서는 SELECT 문을 사용하여 테이블에 insert 할 수 insert .

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



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



declare @tblStudent table (id int,name varchar(300))
declare @tblMarks table (std_id int,std_name varchar(300),subject varchar(50),marks int)

insert into @tblStudent Values (1,'Abdul')
insert into @tblStudent Values(2,'Rahim')

insert into @tblMarks Values(1,'','Math',50)
insert into @tblMarks Values(1,'','History',40)
insert into @tblMarks Values(2,'','Math',30)
insert into @tblMarks Values(2,'','history',80)


select * from @tblMarks

update m
set m.std_name=s.name
 from @tblMarks as m
left join @tblStudent as s on s.id=m.std_id

select * from @tblMarks



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

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



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'



다음 예에서는 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



SQL Server를 사용하는 경우 조인을 지정하지 않고 다른 테이블에서 하나의 테이블을 업데이트하고 where 절에서 두 테이블을 간단히 연결할 수 있습니다. 이것은 훨씬 간단한 SQL 쿼리를 만든다.

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



여기에 모든 다른 접근 방식을 통합합니다.

  1. 업데이트 선택
  2. 공통 테이블 식으로 업데이트
  3. 병합

샘플 테이블 구조는 아래에 있으며 Product_BAK에서 ​​Product 테이블로 업데이트됩니다.

생성물

CREATE TABLE [dbo].[Product](
    [Id] [int] IDENTITY(1, 1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [Description] [nvarchar](100) NULL
) ON [PRIMARY]

Product_BAK

    CREATE TABLE [dbo].[Product_BAK](
        [Id] [int] IDENTITY(1, 1) NOT NULL,
        [Name] [nvarchar](100) NOT NULL,
        [Description] [nvarchar](100) NULL
    ) ON [PRIMARY]

1. 업데이트 선택

    update P1
    set Name = P2.Name
    from Product P1
    inner join Product_Bak P2 on p1.id = P2.id
    where p1.id = 2

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

3. 병합

    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 문에서 대상에서 일치하는 레코드를 찾지 못했지만 소스에 존재하는 경우 inset을 수행 할 수 있으며 구문을 찾으십시오.

    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);



용도:

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')



레코드 (그리고 내가 생각한 다른 것들)를 위해서, 당신은 다음과 같이 MySQL에서 그것을 할 수있다 :

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



SQL Server 대신 MySQL 을 사용하는 경우 구문은 다음과 같습니다.

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



더 짧은 방법 조차 있고 당신을 위해 의외일 것입니다 :

샘플 데이터 세트 :

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];



  1. 내부 결합 사용

UPDATE A SET A.col1 = B.col1, A.col2 = B.col2 FROM Some_Table from 내부 조인 Other_Table AS B ON A.id = B.id WHERE A.col3 = 'cool'

  1. Co 관련 하위 쿼리

UPDATE 테이블 SET Col1 = B.Col1, Col2 = B.Col2 FROM (SELECT ID, Col1, Col2 from other_table) B WHERE B.ID = table.ID




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



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



간단한 방법은 다음과 같습니다.

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



일방 통행

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'



별칭 사용 :

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



그리고 당신이 테이블 자체에 가입하고 싶다면 (너무 자주 일어나지는 않을 것입니다) :

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



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'



이것은 업데이트를 수행하는 틈새 이유 (예 : 주로 프로 시저에서 사용)이거나 다른 사람에게 명백 할 수 있지만 join을 사용하지 않고 update-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



수락 된 답변에서 :

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

내가 추가 할 것이다 :

OUTPUT deleted.*, inserted.*

내가 일반적으로하는 일은 모든 것을 롤백 트랜잭션에 넣고 "OUTPUT" 사용하는 것입니다.이 방법으로 모든 일이 일어날 것입니다. 내가 본 것에 만족할 때, 나는 ROLLBACKCOMMIT 으로 바꾼다.

일반적으로 내가 한 일을 문서화해야하므로 롤백 쿼리를 실행할 때 "results to Text" 옵션 "results to Text" 사용하고 스크립트와 OUTPUT의 결과를 모두 저장합니다. (물론 너무 많은 행을 변경하면 이것은 실용적이지 않습니다.)




나는 다음에 대한 로빈의 탁월한 대답 을 수정할 것이다.

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 절이 없으면 실제로 영향을받지 않아야하는 인덱스 재 계산 또는 실행 트리거를 유발할 수있는 영향을받지 않는 행까지 영향을 미칩니다.




다음은 유용한 구문입니다.

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);

"WHERE EXIST"를 사용하여 널 (null)인지 검사합니다.




이 방법은 업데이트를하기 전에 업데이트 될 내용을 확인할 수 있도록 빠른 방법으로 작성할 수 있도록하기 위해 추가합니다.

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 



  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product






sql sql-server tsql select