조인을 사용한 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
'IT' 카테고리의 다른 글
첫 번째 오류가 발생했을 때 PowerShell 스크립트를 중지하는 방법 (0) | 2023.04.08 |
---|---|
TSQL을 사용하여 데이터베이스의 모든 테이블을 잘라내려면 어떻게 해야 합니까? (0) | 2023.04.08 |
가장자리가 아닌 div 안쪽에 테두리 배치 (0) | 2023.04.08 |
Powershell에서 부모 디렉토리를 가져오려면 어떻게 해야 합니까? (0) | 2023.04.08 |
두 날짜 간의 월차 (0) | 2023.04.08 |