LEFT JOIN을 사용하여 MySQL의 여러 테이블 업데이트
테이블이 2개 있고 왼쪽 조인 내의 모든 행에 대해 T1의 필드를 업데이트하려고 합니다.
간단한 예시를 위해 다음 결과 세트의 모든 행을 업데이트합니다.
SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL
MySQL 설명서에는 다음과 같이 기술되어 있습니다.
여러 테이블 UPDATE 문에서는 SELECT 문에서 허용되는 모든 유형의 조인(LEFT JOIN 등)을 사용할 수 있습니다.
그러나 문서화된 다중 테이블 업데이트에서 적절한 구문을 찾을 수 없습니다.
올바른 구문은 무엇입니까?
UPDATE t1
LEFT JOIN
t2
ON t2.id = t1.id
SET t1.col1 = newvalue
WHERE t2.id IS NULL
주의해 주세요.SELECT
사용하는 것이 더 효율적일 것이다.NOT IN
/NOT EXISTS
구문:
SELECT t1.*
FROM t1
WHERE t1.id NOT IN
(
SELECT id
FROM t2
)
퍼포먼스의 상세한 것에 대하여는, 블로그의 기사를 참조해 주세요.
불행하게도,MySQL
에서는 서브쿼리의 타깃테이블을 사용할 수 없습니다.UPDATE
진술서, 그렇기 때문에 당신은 덜 효율적인 방법을 고수할 필요가 있다.LEFT JOIN
구문을 사용합니다.
데이터가 정규화된 시나리오에도 동일한 내용을 적용할 수 있지만, 이제 세 번째 테이블에서 찾은 값을 테이블에 포함시키게 됩니다.다음은 두 번째 테이블에서 마음에 드는 세 번째 테이블의 정보로 테이블을 업데이트할 수 있습니다.
UPDATE t1
LEFT JOIN
t2
ON
t2.some_id = t1.some_id
LEFT JOIN
t3
ON
t2.t3_id = t3.id
SET
t1.new_column = t3.column;
이는 사용자와 그룹이 있고 사용자가 그룹명의 다른 종류를 추가할 수 있는 경우에 유용합니다.따라서 원래 기존 그룹명을 사용자가 변경할 수 있는 필드에 Import할 필요가 있습니다.
Table A
+--------+-----------+
| A-num | text |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
+--------+-----------+
Table B
+------+------+--------------+
| B-num| date | A-num |
| 22 | 01.08.2003 | 2 |
| 23 | 02.08.2003 | 2 |
| 24 | 03.08.2003 | 1 |
| 25 | 04.08.2003 | 4 |
| 26 | 05.03.2003 | 4 |
표 A의 필드 텍스트를 다음과 같이 업데이트합니다.
UPDATE `Table A`,`Table B`
SET `Table A`.`text`=concat_ws('',`Table A`.`text`,`Table B`.`B-num`," from
",`Table B`.`date`,'/')
WHERE `Table A`.`A-num` = `Table B`.`A-num`
다음과 같은 결과를 얻을 수 있습니다.
Table A
+--------+------------------------+
| A-num | text |
| 1 | 24 from 03 08 2003 / |
| 2 | 22 from 01 08 2003 / |
| 3 | |
| 4 | 25 from 04 08 2003 / |
| 5 | |
--------+-------------------------+
표 B의 한 필드만 허용되지만 다음 결과를 얻습니다.
Table A
+--------+--------------------------------------------+
| A-num | text |
| 1 | 24 from 03 08 2003 |
| 2 | 22 from 01 08 2003 / 23 from 02 08 2003 / |
| 3 | |
| 4 | 25 from 04 08 2003 / 26 from 05 03 2003 / |
| 5 | |
+--------+--------------------------------------------+
UPDATE `Table A` a
SET a.`text`=(
SELECT group_concat(b.`B-num`,' from ',b.`date` SEPARATOR ' / ')
FROM `Table B` b WHERE (a.`A-num`=b.`A-num`)
)
DECLARE @cols VARCHAR(max),@colsUpd VARCHAR(max), @query VARCHAR(max),@queryUpd VARCHAR(max), @subQuery VARCHAR(max)
DECLARE @TableNameTest NVARCHAR(150)
SET @TableNameTest = @TableName+ '_Staging';
SELECT @colsUpd = STUF ((SELECT DISTINCT '], T1.[' + name,']=T2.['+name+'' FROM sys.columns
WHERE object_id = (
SELECT top 1 object_id
FROM sys.objects
WHERE name = ''+@TableNameTest+''
)
and name not in ('Action','Record_ID')
FOR XML PATH('')
), 1, 2, ''
) + ']'
Select @queryUpd ='Update T1
SET '+@colsUpd+'
FROM '+@TableName+' T1
INNER JOIN '+@TableNameTest+' T2
ON T1.Record_ID = T2.Record_Id
WHERE T2.[Action] = ''Modify'''
EXEC (@queryUpd)
언급URL : https://stackoverflow.com/questions/806882/update-multiple-tables-in-mysql-using-left-join
'programing' 카테고리의 다른 글
그룹별 값 목록에서 n번째 값을 쿼리하려면 어떻게 해야 합니까?MySQL (0) | 2023.01.19 |
---|---|
mysql, percona, maria 중 어느 것을 결정하다DB (0) | 2023.01.19 |
Axios 처리 오류 (0) | 2023.01.19 |
Vue 구성 요소가 다른 구성 요소를 확장하는지 확인합니다. (0) | 2023.01.19 |
지시어를 정의할 때 '컨트롤러', '링크' 및 '컴파일' 함수의 차이 (0) | 2023.01.19 |