IT

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

itgroup 2023. 4. 8. 08:23
반응형

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

필드를 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테이블의 필드 값item_master위의 조건에 결합되어 있는 다른 값을 사용합니다.

MS SQL Server에서 이 작업을 수행하려면 어떻게 해야 합니까?

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

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

가장 쉬운 방법 중 하나는 공통 테이블 식을 사용하는 것입니다(이미 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>

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

위의 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%'

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 절에서는 이들 테이블을 바인드하기 위한 조건과 조인 조작을 지정해야 합니다.

마크

MySQL: 일반적으로 필요에 따라 필요에 따라 변경합니다.

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

SQL의 join 쿼리를 사용하여 간단하게 갱신할 수 있습니다.사용하지 않고 할 수 있습니다. FROM절을 클릭합니다.다음은 예를 제시하겠습니다.

    UPDATE customer_table c 

      JOIN  
          employee_table e
          ON c.city_id = e.city_id  
      JOIN 
          anyother_ table a
          ON a.someID = e.someID

    SET c.active = "Yes"

    WHERE c.city = "New york";

다음 조회를 사용할 수 있습니다.

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`

이렇게 해봐...

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;

SQL Server를 사용하는 경우 join을 지정하지 않고 다른 테이블에서1개의 테이블을 갱신하고 where 구에서2개의 테이블을 링크하기만 하면 됩니다.따라서 SQL 쿼리가 훨씬 단순해집니다.

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

커맨드로 업데이트 할 수 있습니다.MATCHED그리고.NOT 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

기존의 모든 답변에 경고를 추가합니다.

SELECT ... FROM 구문을 사용할 경우 T-SQL의 고유 구문이며 비결정적 구문이라는 점에 유의해야 합니다.가장 나쁜 점은 경고나 오류가 발생하지 않고 원활하게 실행될 수 있다는 것입니다.

를 포함한 자세한 설명은 매뉴얼에 기재되어 있습니다.

업데이트 작업의 기준을 제공하기 위해 FROM 절을 지정할 때는 주의하십시오.UPDATE 문의 결과는 갱신되는 각 컬럼 오카렌스에 대해 하나의 값만 사용할 수 있도록 지정되지 않은 FROM 절이 문에 포함되어 있는 경우, 즉 UPDATE 문이 확정적이지 않은 경우 정의되지 않습니다.

계속 이런 일을 하려고 했는데, 다음 구문(튜플 사용)을 사용해 봐야겠다는 생각이 들었습니다.

update dstTable T
set (T.field1, T.field2, T.field3) = 
       (select S.value1, S.value2, S.value3
        from srcTable S
         where S.key = T.Key);

그리고 놀랍게도 효과가 있었다.Oracle (12c 정도)를 사용하고 있습니다.이 표준 SQL 또는 Oracle은 고유합니까?

NB: 이 예에서는 전체 표를 업데이트하고 있습니다(새 열 채우기).업데이트에는 where 구가 없으므로 모든 행이 업데이트됩니다.하위 쿼리가 행을 반환하지 않을 경우 필드는 NULL로 설정됩니다(또한 두 개 이상의 행을 반환해서는 안 됩니다).

언급URL : https://stackoverflow.com/questions/982919/sql-update-query-using-joins

반응형