조인을 사용한 SQL 업데이트 쿼리


664

3 테이블의 조인으로 반환 된 값으로 필드를 업데이트해야합니다.

예:

select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34

위의 조건에서 조인 된 다른 mf_item_number값으로 table 의 필드 값 을 업데이트하고 싶습니다 item_master.

MS SQL Server에서 어떻게해야합니까?


124
암시 적 조인을 사용하지 마십시오. 예기치 않은 교차 ​​조인으로 인해 잘못된 결과를 초래하는 좋지 않은 기술입니다. 이 코드 스타일은 18 년이 지났습니다
HLGEM

답변:


1251
UPDATE im
SET mf_item_number = gm.SKU --etc
FROM item_master im
JOIN group_master gm
    ON im.sku = gm.sku 
JOIN Manufacturer_Master mm
    ON gm.ManufacturerID = mm.ManufacturerID
WHERE im.mf_item_number like 'STA%' AND
      gm.manufacturerID = 34

명확하게하기 위해 ... UPDATE절은 절에 지정된 테이블 별칭을 참조 할 수 있습니다 FROM. 따라서이 im경우에는 유효합니다

일반적인 예

UPDATE A
SET foo = B.bar
FROM TableA A
JOIN TableB B
    ON A.col1 = B.colx
WHERE ...

9
Postgres는 다음에 대해 불평합니다 UPDATE im. / : 메신저 포스트 그레스가 인식하지 못하는 별칭입니다
fatuhoku

10
참고로 이것은 MySQL (다른 구문)에서는 작동 하지 않습니다 ! MySQL의 경우 gcbenison의 답변을 살펴보십시오
Sliq

67

가장 쉬운 방법 중 하나는 공통 테이블 식을 사용하는 것입니다 (이미 SQL 2005를 사용하고 있으므로).

with cte as (
select
    im.itemid
    ,im.sku as iSku
    ,gm.SKU as GSKU
    ,mm.ManufacturerId as ManuId
    ,mm.ManufacturerName
    ,im.mf_item_number
    ,mm.ManufacturerID
    , <your other field>
from 
    item_master im, group_master gm, Manufacturer_Master mm 
where
    im.mf_item_number like 'STA%'
    and im.sku=gm.sku
    and gm.ManufacturerID = mm.ManufacturerID
    and gm.manufacturerID=34)
update cte set mf_item_number = <your other field>

쿼리 실행 엔진은 자체적으로 레코드를 업데이트하는 방법을 알아냅니다.


8
CTE를 사용하면 원본 SELECT를 UPDATE로 간단하게 변환 할 수 있습니다.
SteveC

4
SELECT 쿼리에 집계, DISTINCT 등이없는 한 작동합니다.
Baodad

1
나는 일반적으로 세미콜론으로 시작하여 이전 문장을 종료합니다 (있는 경우). CTE 락! 복잡한 쿼리 / 조인 업데이트를 간단하게 설계 할 수 있습니다. 나는 항상 그것을 사용합니다 ...
Adam W

64

이것을 MySQL에 적용-에 FROM절이 UPDATE없지만 다음과 같이 작동합니다.

UPDATE
    item_master im
    JOIN
    group_master gm ON im.sku=gm.sku 
    JOIN
    Manufacturer_Master mm ON gm.ManufacturerID=mm.ManufacturerID
SET
    im.mf_item_number = gm.SKU --etc
WHERE
    im.mf_item_number like 'STA%'
    AND
    gm.manufacturerID=34

12

위의 SQL을 사용하지 않았지만 다음은 join 문을 기반으로 테이블을 업데이트하는 예입니다.

UPDATE p
SET    p.category = c.category
FROM   products p
       INNER JOIN prodductcatagories pg
            ON  p.productid = pg.productid
       INNER JOIN categories c
            ON  pg.categoryid = c.cateogryid
WHERE  c.categories LIKE 'whole%'

8

다음과 같이 UPDATE 문에서 "FROM"절로 업데이트 할 방법과 내용을 결정하는 데 사용되는 추가 테이블을 지정할 수 있습니다.

update item_master
set mf_item_number = (some value)
from 
   group_master as gm
   join Manufacturar_Master as mm ON ........
where
 .... (your conditions here)

WHERE 절에서 이러한 테이블을 바인드하려면 조건을 제공하고 조인 조작을 제공해야합니다.

마크


5
FROM 절에서 ANSI JOINS 사용
gbn

5
예, ansi 조인을 사용하십시오. 실수로 크로스 조인을 받으면 업데이트에 실제로 문제가 발생할 수 있습니다.
HLGEM 2016 년

7

MySQL : 일반적으로 요구 사항에 따라 필요한 변경을 수행하십시오.

UPDATE
    shopping_cart sc
    LEFT JOIN
    package pc ON sc. package_id = pc.id    
SET
    sc. amount = pc.amount

3

이렇게 해보십시오 ...

Update t1.Column1 = value 
from tbltemp as t1 
inner join tblUser as t2 on t2.ID = t1.UserID 
where t1.[column1]=value and t2.[Column1] = value;

2

다음 쿼리를 사용할 수 있습니다.

UPDATE im
SET mf_item_number = (some value) 
FROM item_master im
JOIN group_master gm
    ON im.sku = gm.sku 
JOIN Manufacturer_Master mm
    ON gm.ManufacturerID = mm.ManufacturerID
WHERE im.mf_item_number like 'STA%' AND
      gm.manufacturerID = 34    `sql`

1

당신은 함께 업데이트 할 수 있습니다 MERGE더 많은 통제와 명령 MATCHEDNOT MATCHED: (나는 약간 변경 소스 코드를 내 지점을 증명)

USE tempdb;
GO
IF(OBJECT_ID('target') > 0)DROP TABLE dbo.target
IF(OBJECT_ID('source') > 0)DROP TABLE dbo.source
CREATE TABLE dbo.Target
    (
      EmployeeID INT ,
      EmployeeName VARCHAR(100) ,
      CONSTRAINT Target_PK PRIMARY KEY ( EmployeeID )
    );
CREATE TABLE dbo.Source
    (
      EmployeeID INT ,
      EmployeeName VARCHAR(100) ,
      CONSTRAINT Source_PK PRIMARY KEY ( EmployeeID )
    );
GO
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 100, 'Mary' );
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 101, 'Sara' );
INSERT  dbo.Target
        ( EmployeeID, EmployeeName )
VALUES  ( 102, 'Stefano' );

GO
INSERT  dbo.Source
        ( EmployeeID, EmployeeName )
VALUES  ( 100, 'Bob' );
INSERT  dbo.Source
        ( EmployeeID, EmployeeName )
VALUES  ( 104, 'Steve' );
GO

SELECT * FROM dbo.Source
SELECT * FROM dbo.Target

MERGE Target AS T
USING Source AS S
ON ( T.EmployeeID = S.EmployeeID )
WHEN MATCHED THEN
    UPDATE SET T.EmployeeName = S.EmployeeName + '[Updated]';
GO 
SELECT '-------After Merge----------'
SELECT * FROM dbo.Source
SELECT * FROM dbo.Target
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.